Java中TCP与UDP网络通信原理及实现代码详解
TCP与UDP是Java网络编程的两大核心协议。TCP通过三次握手建立可靠连接,适合对数据完整性要求高的场景;UDP面向无连接,传输速度快但不保证数据可靠性。本文将详细解析两者的工作原理,并提供Java实现的完整代码示例。
TCP与UDP协议的区别
TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)都是TCP/IP协议族的重要组成部分,但它们在连接方式、安全性及传输效率上有显著差异。
1. TCP:面向连接的可靠传输
TCP在收发数据前必须与对方建立可靠的连接。这个过程需要通过“三次握手”来完成,主要目的是同步两台主机的状态,确保双方都能正常发送和接收数据:
- 第一次对话:主机A向主机B发出连接请求数据包,询问是否可以发送数据。
- 第二次对话:主机B回复同意连接,并请求同步发送与接收状态。
- 第三次对话:主机A确认主机B的要求,正式准备开始数据传输。
经过这三次交互后,TCP连接建立完毕,此时才能正式传输数据。这种机制保证了传输的安全性,并能确认对方是否成功接收到信息。
2. UDP:非连接的快速传输
UDP是一个面向非连接的协议。在发送数据之前,源端和目标端不需要建立连接。它直接从应用程序抓取数据并尽可能快地发送到网络上。
- 发送端:受限于应用程序生成数据的速度、计算机处理能力以及传输带宽。
- 接收端:将每个消息段放入队列,应用程序按需从队列中读取。
由于省去了复杂的握手过程,UDP的传输速度非常快捷。但其代价是不保证传输的安全性,也无法确认对方是否成功接收到了信息。
Java TCP网络通信代码实现
在Java中,TCP通信主要通过 Socket 和 ServerSocket 类来实现。下面分别展示客户端(发送方)和服务端(接收方)的基础实现。
第一步:编写TCP发送端代码
发送端需要创建一个 Socket 对象连接到指定IP地址和端口,并通过输出流发送数据。为了简单起见,以下示例使用控制台输入作为发送内容,输入特定结束码(如 "1024")后断开连接。
// 向指定ip发送信息
public static void main(String[] args) throws Exception {
// 创建Socket连接本机10000端口
Socket s = new Socket(InetAddress.getByName(
InetAddress.getLocalHost().getHostAddress()), 10000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 封装输出流对象
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
String line;
while (true) {
if ((line = br.readLine()) != null) {
// 遇到特定命令退出循环
if ("1024".equals(line)) {
bw.write(line);
bw.newLine();
break;
}
bw.write(line);
bw.newLine();
}
bw.flush();
}
// 释放资源
s.close();
}第二步:编写TCP接收端代码
服务端使用 ServerSocket 监听指定端口,等待并接受客户端的连接请求。一旦连接建立,即可通过输入流读取数据。
// 接收发送到本机的信息
ServerSocket socket = new ServerSocket(10000);
Socket accept = socket.accept();
BufferedReader br = new BufferedReader(
new InputStreamReader(accept.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}若要让两端同时运行并互通,可以使用多线程进行封装,以避免IO阻塞导致程序假死。
Java UDP网络通信代码实现
UDP通信在Java中通过 DatagramSocket 和 DatagramPacket 类实现。在使用UDP时,通常需要将目标IP地址设置为 ipconfig 等工具显示的局域网IP或网关地址。
第三步:编写UDP发送端代码
发送端需先创建 DatagramSocket,然后将数据打包成 DatagramPacket 对象,最后调用 send() 方法发出。
// 创建发送端的Socket对象(DatagramSocket)
// 构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramSocket ds = new DatagramSocket();
byte[] bys = "hello,udp,我来了".getBytes();
// 创建数据包:数据内容、长度、目标IP、目标端口
DatagramPacket dp = new DatagramPacket(
bys, bys.length, InetAddress.getByName("10.102.13.18"), 10086);
// 调用DatagramSocket对象的方法发送数据
void send(DatagramPacket p); // 从此套接字发送数据报包
ds.send(dp);
System.out.println("已发送:" + new String(dp.getData(), 0, dp.getLength()));
// 关闭发送端
// void close() 关闭此数据报套接字
ds.close();第四步:编写UDP接收端代码
接收端同样使用 DatagramSocket 监听指定端口,并使用 receive() 方法接收数据包。由于UDP是无连接的,接收端需要在固定端口持续监听。
DatagramSocket ds = new DatagramSocket(10086);
while (true) {
// 创建一个数据包,用于接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 调用DatagramSocket对象的方法接收数据
ds.receive(dp);
System.out.println("-----");
// 解析数据包,并把数据在控制台显示
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}总结而言,TCP适用于需要高可靠性的长连接通信,而UDP则更适合追求低延迟和快速传输的场景。理解两者底层原理并掌握对应的Java API是实现稳定网络应用的基础。以上就是关于Java中TCP与UDP网络通信的详细讲解,更多关于Java网络编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













