InetAddress 类封装 IP 地址,提供 getByName、getHostAddress 等方法。UDP 用 DatagramPacket(数据报)封装数据,DatagramSocket 收发:
// 发送端
DatagramSocket socket = new DatagramSocket();
byte[] data = "hello".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length,
InetAddress.getByName("127.0.0.1"), 9999);
socket.send(packet);
socket.close();
TCP 用 Socket(客户端)与 ServerSocket(服务端)建立可靠连接:
// 服务端
ServerSocket server = new ServerSocket(9999);
Socket client = server.accept(); // 阻塞等待连接
try (BufferedReader br = new BufferedReader(
new InputStreamReader(client.getInputStream()))) {
String line = br.readLine(); // 读客户端数据
}
// 客户端
Socket socket = new Socket("127.0.0.1", 9999);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("hello");
accept() 阻塞等待客户端连接,连接建立后通过输入输出流收发数据。socket/bind/listen/accept),功能强大但繁琐、易错。socket 模块与 Java 类似,socketserver 提供更高层封装,代码更少。关键差异:Java 把 socket 封装成
Socket/ServerSocket类,屏蔽了 C 式底层系统调用的细节;网络 IO 本质仍是字节流,可与第 12 章 IO 流无缝衔接。现代高并发更推荐 NIO(java.nio的 Selector/Channel)而非一线程一连接。