以下是 Java Socket 网络编程的核心知识点梳理,结合应用场景及常见问题总结:
一、基础概念
- Socket 定义
- 用于不同主机或进程间的双向通信端点,基于 TCP/UDP 协议实现。
- TCP:面向连接,保证数据可靠传输(如文件传输、HTTP 请求)。
- UDP:无连接,强调传输效率(如视频流、实时消息)。
- 核心要素
- IP 地址:标识网络中的设备(通过 InetAddress 类操作)。
- 端口号:区分同一主机上的不同应用程序(0-65535)。
- 协议:规定通信规则(如 HTTP 默认端口 80)。
二、核心类与 API
类名 | 用途 |
---|---|
ServerSocket | TCP 服务端监听指定端口,等待客户端连接 |
Socket | TCP 客户端与服务端通信的端点,支持输入/输出流操作 |
DatagramSocket | UDP 通信端点,通过数据报(DatagramPacket)传输数据 |
InetAddress | 封装 IP 地址,支持通过主机名获取 IP(如 InetAddress.getByName("localhost") ) |
三、TCP 编程实现
1. 服务端步骤
ServerSocket server = new ServerSocket(8888); // 绑定端口
while (true) {
Socket client = server.accept(); // 阻塞等待客户端连接
new Thread(() -> handleClient(client)).start(); // 多线程处理[2]()
}
void handleClient(Socket client) {
try (InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream()) {
// 读取数据并处理
}
}
2. 客户端步骤
Socket socket = new Socket("127.0.0.1", 8888); // 连接服务端
OutputStream out = socket.getOutputStream();
out.write("Hello".getBytes());
3. 关键问题
- 消息结束标识:需约定结束符(如 END)或通过 shutdownOutput()关闭输出流。
- 资源释放:优先关闭 Socket 而非单独关闭流,避免连接残留。
四、UDP 编程实现
1. 服务端/客户端通用流程
DatagramSocket socket = new DatagramSocket(9999); // 绑定端口
byte[] buffer = new byte[1024]();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet); // 接收数据报
String msg = new String(packet.getData(), 0, packet.getLength());
2. 发送数据示例
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket sendPacket = new DatagramPacket(
"Data".getBytes(), "Data".length(), address, 9999);
socket.send(sendPacket);
五、常见问题与优化
- 多线程优化
- 服务端使用线程池处理请求,避免频繁创建线程。
- 设置线程优先级(如 thread.setPriority(4) )平衡性能。
- 参数调优
- SO_TIMEOUT:设置等待超时时间。
- SO_REUSEADDR:允许端口复用,解决重启时地址占用问题。
- 性能瓶颈
- 高并发场景建议使用 NIO(非阻塞 IO)替代传统 Socket。
六、应用场景对比
场景 | 适用协议 | 特点 |
---|---|---|
文件传输、网页访问 | TCP | 数据完整性要求高,需稳定连接 |
实时视频、在线游戏 | UDP | 容忍部分数据丢失,追求低延迟 |
扩展建议:若需深入 TCP 粘包/拆包处理或 NIO 进阶用法,可参考中的 Socket 参数详解及中的多线程优化实践。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于