Socket 编程基础
2026/8/24大约 1 分钟
Socket 编程基础
Socket(套接字)是网络编程的抽象接口,对 TCP/IP 协议进行了封装。本章介绍 Java 中基于 TCP 和 UDP 的 Socket 编程基本流程。
一、Socket 概述
Socket 是应用层与传输层之间的抽象层,把 TCP/IP 协议族的复杂操作封装为几个简单的接口。常用的有两类:
| 类型 | 协议 | 特点 |
|---|---|---|
| 流式套接字(Stream Socket) | TCP | 面向连接,可靠,有序 |
| 数据报套接字(Datagram Socket) | UDP | 无连接,不可靠,效率高 |
二、基于 TCP 的 Socket 编程
客户端流程
Socket socket = new Socket("ip", 端口);
// 获取输入流(读取服务器数据)
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
// 获取输出流(发送数据到服务器)
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);服务器端流程
ServerSocket serverSocket = new ServerSocket(端口);
Socket socket = serverSocket.accept(); // 阻塞等待客户端连接
// 获取流的方式与客户端一样读取输入流
byte[] buffer = new byte[1024];
while (true) {
int count = is.read(buffer);
if (count <= 0) {
break;
}
// 对 buffer 保存或者做些其他操作
}三、基于 UDP 的 Socket 编程
UDP 客户端和服务器端的代码结构相同:
DatagramSocket socket = new DatagramSocket(端口);
InetAddress serverAddress = InetAddress.getByName("ip");
// 发送
DatagramPacket packet = new DatagramPacket(buffer, length, host, port);
socket.send(packet);
// 接收
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, 1024);
socket.receive(packet);四、TCP 与 UDP 编程对比
| 对比项 | TCP | UDP |
|---|---|---|
| 核心类 | Socket / ServerSocket | DatagramSocket / DatagramPacket |
| 是否区分客户端服务器 | 区分,服务器需 accept | 不区分,代码结构一致 |
| 数据边界 | 字节流,需自行处理粘包 | 报文边界天然保留 |
| 可靠性 | 可靠,有确认重传 | 不可靠,可能丢包 |
| 适用场景 | 文件传输、聊天、HTTP | 视频通话、实时游戏、DNS |