Java网络编程之TCP、UDP
Java网络编程之TCP、UDP
版权声明:本文为博主原创文章,未经博主允许不得转载。
一、TCP网络通信
Java中使用Socket(套接字)实现TCP。服务器端使用ServerSocket类,客户端使用Socket类实现。
1、ServerSocket类
其主要有如下的方法:
ServerSocket() 创建非绑定服务器套接字。
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
Socket accept() 侦听并接受到此套接字的连接。
void close() 关闭此套接字
boolean isClosed() 返回 ServerSocket 的关闭状态。
InetAddress getInetAddress() 返回此服务器套接字的本地地址。
void bind(SocketAddress endpoint) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
boolean isBound() 返回 ServerSocket 的绑定状态。
SocketAddress getLocalSocketAddress() 返回此套接字绑定的端点的地址,如果尚未绑定则返回 null。
服务器端每次运行是都要使用accept()方法等待客户端的连接,此方法执行之后服务器端将进入阻塞状态,知道客户端连接之后程序才继续执行,此方法返回是Socket,代表一个客户端对象。
2、Socket类
两台机器连接通信的端点。主要使用如下方法:
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
OutputStream getOutputStream() 返回此套接字的输出流。
InputStream getInputStream() 返回此套接字的输入流。
boolean isBound() 返回套接字的绑定状态。
boolean isClosed() 返回套接字的关闭状态。
boolean isConnected() 返回套接字的连接状态。
void close() 关闭此套接字。
其通过字节流和服务端进行通信。
实例一、下面是实现一个简单的TCP客户端可服务器端通信。
(1)服务器端:
- package andy.network.test;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午10:49:11
- *
- *
- */
- public class FirstTCPServer {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- //创建服务器
- ServerSocket server = null;
- Socket socket = null;
- PrintStream out = null;
- //服务器在9999上等待客户端的访问
- server = new ServerSocket(9999);
- System.out.println("服务器端已经运行,等待客户的响应。。。");
- //程序阻塞 等待客户端的访问
- socket = server.accept();
- //向客户端输出信息
- String str = "hello andy.";
- out = new PrintStream(socket.getOutputStream());
- out.print(str);
- out.close();
- socket.close();
- server.close();
- }
- }
(2)客户端:
- package andy.network.test;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.Socket;
- import java.net.UnknownHostException;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:02:17
- *
- *
- */
- public class FirstTCPSocket {
- /**
- * @param args
- * @throws IOException
- * @throws UnknownHostException
- */
- public static void main(String[] args) throws UnknownHostException,
- IOException {
- // 定义客户端
- Socket client = null;
- // 设置地址和端口
- client = new Socket("localhost", 9999);
- BufferedReader buf = null; // 结束服务端流
- buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
- String str = buf.readLine();
- System.out.println("服务器端通知信息:" + str);
- buf.close();
- client.close();
- }
- }
实例二
实现客户端和服务器端的通信,服务器端可以响应多个客户端,每个客户端请求就启动一个线程。
(1)服务端
- package andy.network.test;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:41:22
- *
- * 聊天服务器端
- */
- public class ChatServer {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- ServerSocket server = null;
- Socket client = null;
- // 监听9999端口的连接
- server = new ServerSocket(9999);
- boolean flag = true;
- while (flag) {
- System.out.println("服务器运行,等待客户端连接。");
- client = server.accept();
- // 对每一个客户端请求启动一个线程
- new Thread(new ChatThread(client)).start();
- }
- server.close();
- }
- }
对应服务端线程任务:
- package andy.network.test;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.PrintStream;
- import java.net.Socket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:24:26
- *
- * 使用多线程机制,在每个用户响应之后启动一个新任务
- *
- */
- public class ChatThread implements Runnable {
- // 接受客户端
- private Socket client = null;
- public ChatThread(Socket client) {
- this.client = client;
- }
- @Override
- public void run() {
- // 向客户端发送数据
- PrintStream out = null;
- // 接收客户端发来的数据
- BufferedReader buff = null;
- try {
- // 得到客户端的输入信息
- buff = new BufferedReader(new InputStreamReader(
- client.getInputStream()));
- out = new PrintStream(client.getOutputStream());
- //标志是否一个客户端的操作完毕
- boolean flag = true;
- while (flag) {
- //不断的接收信息
- String str = buff.readLine();
- if(str == null || "".equals(str)){
- flag = false;//客户端操作结束
- }else{
- if("bye".equals(str)){
- flag = false;
- out.println("bye-bye");
- }else {
- //向客户端回显输入
- out.println("you input:" + str);
- }
- }
- }
- out.close();
- client.close();
- } catch (Exception e) {
- System.out.println("服务器异常!");
- }
- }
- }
(2)客户端
- package andy.network.test;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:53:03
- *
- * 聊天客户端程序
- *
- */
- public class ChatClient {
- public static void main(String[] args) throws UnknownHostException,
- IOException {
- Socket client = null;
- client = new Socket("localhost", 9999);
- // 接收服务器端的信息
- BufferedReader buff = null;
- // 向服务器端发送数据
- PrintStream out = null;
- BufferedReader input = null;
- // 获取键盘输入数据
- input = new BufferedReader(new InputStreamReader(System.in));
- out = new PrintStream(client.getOutputStream());
- buff = new BufferedReader(
- new InputStreamReader(client.getInputStream()));
- // 标志位
- boolean flag = true;
- while (flag) {
- System.out.println("输入信息:");
- String str = input.readLine();
- // 向服务器端输出信息
- out.println(str);
- if ("bye".equals(str)) {
- flag = false;
- } else {
- String chatCont = buff.readLine();
- System.out.println(chatCont);
- }
- }
- client.close();
- buff.close();
- }
- }
二、UDP网络通信
TCP的通信是建立在可靠通信的基础上,UDP则是不可靠的通信,使用数据报形式发送数据。
在Java中主要有DatagramPacket和DatagramSocket实现。
1、DatagramPacket主要方法
DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
2、DatagramSocket主要方法
DatagramSocket(int port)
创建数据报套接字并将其绑定到本地主机上的指定端口。
void receive(DatagramPacket p)
从此套接字接收数据报包。
void send(DatagramPacket p)
从此套接字发送数据报包。
在使用UDP时,先使用客户端指定好要接受的数据和端口。然后开启服务端发送数据。
实现如下:
(1)客户端
- package andy.network.test;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 下午3:04:10
- *
- * UDP客户端
- */
- public class UDPClient {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- // 客户在9999端口监听
- DatagramSocket dSocket = null;
- dSocket = new DatagramSocket(9999);
- // 定义接收数据的字节长度
- byte[] buff = new byte[1024];
- DatagramPacket dPacket = null;
- // 指定接收数据的长度1024
- dPacket = new DatagramPacket(buff, 1024);
- System.out.println("等待接受数据。。");
- //接收数据
- dSocket.receive(dPacket);
- String str = new String(dPacket.getData(), 0, dPacket.getLength())
- + "from" + dPacket.getAddress().getHostAddress() + ":"
- + dPacket.getPort();
- System.out.println(str);
- //关闭数据报套接字
- dSocket.close();
- }
- }
(2)服务器端
- package andy.network.test;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 下午3:13:38
- *
- * UDP服务器端
- *
- */
- public class UDPServer {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- DatagramSocket dSocket = null;
- //服务端在3333端口监听
- dSocket = new DatagramSocket(3333);
- DatagramPacket dPacket = null;
- //要发生的数据
- String str = "hello andy!";
- //向目标端口地址发送数据报
- dPacket = new DatagramPacket(str.getBytes(), str.length(),
- InetAddress.getByName("localhost") , 9999);
- System.out.println("发送数据报");
- dSocket.send(dPacket);
- dSocket.close();
- }
- }

Java网络编程之TCP、UDP的更多相关文章
- 4.Java网络编程之TCP/UDP
常见传输协议: UDP , TCP UDP协议: 特点: 1.将数据及源和目的封装成数据包中,不需要建立连接 2.每个数据包的大小限制在64K内 ...
- Java网络编程之TCP
Java网络编程之TCP TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- Java网络编程之TCP通信
一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. Server ...
- 网络编程之TCP/UDP及其流程比较(转)
TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证 具体编程 ...
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- java网络编程之TCP实例
Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgr ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
- Java网络编程之InetAddress浅析
Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...
随机推荐
- 控制div固定在页面的某个位置 ,用js感觉很麻烦 CSS更好一些
CSS代码:<style type="text/css"> html,body { width:100%; height:100%; margin:0px; paddi ...
- CCF模拟题 窗口
窗口 时间限制: 1.0s 内存限制: 256.0MB 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域.窗口的边界上的点也属于该窗口.窗口之间有层次的 ...
- EditPlus 使用技巧以及快捷键
一边阅读,一边动手吧! 为了达到更好的效果,请你先下载我打包的这个 EditPlus压缩包文件(压缩包文件为绿色的EditPlus2.31英文版,含自动完成文件,高亮语法文件和剪切板代码片断文件,这些 ...
- xgboost参数调优的几个地方
tree ensemble里面最重要就是防止过拟合. min_child_weight是叶子节点中样本个数乘上二阶导数后的加和,用来控制分裂后叶子节点中的样本个数.样本个数过少,容易过拟合. su ...
- Supermap 组合单值专题图与标签专题图演示样例
效果图例如以下:单值专题图并显示每一个区域的相关文字信息 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2hmdQ==/font/5a6L5L2T ...
- asp.net 站点在Apache下的配置,就这么简单
asp.net 站点在Apache下的配置,就这么简单 # # Virtual Hosts # # If you want to maintain multiple domains/hostnames ...
- SSM(spring,springMVC,Mybatis)框架的整合
这几天想做一个小项目,所以搭建了一个SSM框架. 1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Joh ...
- Linq聚合函数使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Entity Framework的原理及使用方式
ADO.NET Entity Framework操作数据库的过程对用户是透明的(当然我们可以通过一些工具或方法了解发送到数据库的SQL语句等).我们唯一能做的是操作EDM,EDM会将这个操作请求发往数 ...
- javafx Cursor
public class EffectTest extends Application { ObservableList cursors = FXCollections.observableArray ...