Java中的TCP与UDP

文章目录


一、TCP通信实例(客户端+服务器)

TCP需先建立连接(三次握手),通信过程基于IO流,数据传输可靠。

1. TCP服务器端(ServerSocket)
java 复制代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        // 1. 启动服务器,绑定端口(TCP核心:需先创建ServerSocket监听连接)
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("TCP服务器已启动,等待客户端连接...");
        
        // 2. 阻塞等待客户端连接(TCP核心:必须通过accept()获取客户端Socket,建立连接)
        Socket clientSocket = serverSocket.accept();
        System.out.println("客户端已连接:" + clientSocket.getInetAddress());
        
        // 3. 通过Socket获取IO流,实现数据读写(TCP核心:基于流传输,需处理输入输出流)
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        
        // 4. 读取客户端消息
        String clientMsg = in.readLine();
        System.out.println("收到客户端消息:" + clientMsg);
        
        // 5. 向客户端发送响应
        out.println("TCP服务器已收到消息:" + clientMsg);
        
        // 6. 关闭资源(TCP需关闭流和Socket、ServerSocket)
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }
}
2. TCP客户端(Socket)
java 复制代码
import java.io.*;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        // 1. 直接连接指定IP和端口的服务器(TCP核心:客户端需主动创建Socket发起连接)
        Socket socket = new Socket("127.0.0.1", 8888);
        
        // 2. 通过Socket获取IO流(TCP核心:与服务器共用一个Socket的流进行双向通信)
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
        // 3. 向服务器发送消息
        out.println("Hello TCP Server!");
        
        // 4. 读取服务器响应
        String serverMsg = in.readLine();
        System.out.println("收到服务器响应:" + serverMsg);
        
        // 5. 关闭资源
        out.close();
        in.close();
        socket.close();
    }
}

二、UDP通信实例(发送端+接收端)

UDP无需建立连接,通过"数据包"直接发送,数据传输不可靠。

1. UDP接收端(DatagramSocket)
java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceiver {
    public static void main(String[] args) throws Exception {
        // 1. 创建Socket绑定端口(UDP核心:无需监听连接,直接绑定端口等待数据包)
        DatagramSocket socket = new DatagramSocket(8888);
        System.out.println("UDP接收端已启动,等待数据包...");
        
        // 2. 创建缓冲区,用于存储接收的数据包(UDP核心:需手动定义缓冲区大小)
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        
        // 3. 阻塞等待接收数据包(UDP核心:通过receive()接收DatagramPacket,而非连接)
        socket.receive(packet);
        
        // 4. 解析数据包内容
        String msg = new String(packet.getData(), 0, packet.getLength());
        System.out.println("收到数据包:" + msg);
        System.out.println("发送端IP:" + packet.getAddress().getHostAddress());
        
        // 5. 关闭资源(仅需关闭DatagramSocket)
        socket.close();
    }
}
2. UDP发送端(DatagramSocket)
java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpSender {
    public static void main(String[] args) throws Exception {
        // 1. 创建Socket(UDP核心:发送端Socket无需绑定固定端口,系统自动分配)
        DatagramSocket socket = new DatagramSocket();
        
        // 2. 准备发送的数据(UDP核心:需将数据转成字节数组,封装成DatagramPacket)
        String msg = "Hello UDP Receiver!";
        byte[] data = msg.getBytes();
        InetAddress targetIp = InetAddress.getByName("127.0.0.1");
        // 封装数据包:数据、数据长度、目标IP、目标端口
        DatagramPacket packet = new DatagramPacket(data, data.length, targetIp, 8888);
        
        // 3. 发送数据包(UDP核心:通过send()直接发送数据包,无需先建立连接)
        socket.send(packet);
        System.out.println("UDP数据包已发送");
        
        // 4. 关闭资源
        socket.close();
    }
}

三、TCP与UDP的核心区别(对应代码部分)

区别维度 TCP代码核心特征 UDP代码核心特征
1. 连接建立 服务器需ServerSocket.accept()监听连接,客户端需new Socket(ip, port)发起连接 无需建立连接,发送端直接封装数据包发送,接收端直接等数据包
2. 数据传输载体 基于InputStream/OutputStream(IO流)读写数据 基于DatagramPacket(数据包)封装/解析数据
3. 核心类 必须用ServerSocket(服务器)+ Socket(客户端) 仅需DatagramSocket(发送/接收端通用)
4. 资源与可靠性 需关闭流、Socket、ServerSocket,数据自动保证有序无丢失 仅关闭DatagramSocket,需手动处理数据丢失/乱序
相关推荐
森语林溪3 分钟前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机
郝开41 分钟前
Spring Boot 2.7.18(最终 2.x 系列版本)1 - 技术选型:连接池技术选型对比;接口文档技术选型对比
java·spring boot·spring
小猪咪piggy1 小时前
【项目】小型支付商城 MVC/DDD
java·jvm·数据库
知兀1 小时前
【Spring/SpringBoot】SSM(Spring+Spring MVC+Mybatis)方案、各部分职责、与Springboot关系
java·spring boot·spring
向葭奔赴♡1 小时前
Spring IOC/DI 与 MVC 从入门到实战
java·开发语言
早退的程序员1 小时前
记一次 Maven 3.8.3 无法下载 HTTP 仓库依赖的排查历程
java·http·maven
向阳而生,一路生花1 小时前
redis离线安装
java·数据库·redis
Tigshop开源商城系统1 小时前
Tigshop 开源商城系统 php v5.1.9.1版本正式发布
java·大数据·开源·php·开源软件
2401_841495642 小时前
【数据结构】基于BF算法的树种病毒检测
java·数据结构·c++·python·算法·字符串·模式匹配
little_xianzhong2 小时前
三个常听到的消息/中间件MQTT RabbitMQ Kafka
java·笔记·中间件·消息队列