Java Socket 基础教程
Java Socket 基础教程
Socket 简介
Socket 是网络通信的基础,允许不同主机之间进行数据传输。Java 提供了 java.net
包来实现 Socket 编程,支持 TCP 和 UDP 协议。
TCP Socket 编程
TCP 是一种面向连接的协议,提供可靠的数据传输。以下是 TCP Socket 的基本实现方式:
服务器端代码
import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);System.out.println("Server started, waiting for client...");Socket clientSocket = serverSocket.accept();System.out.println("Client connected: " + clientSocket.getInetAddress());BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);String message = in.readLine();System.out.println("Received from client: " + message);out.println("Hello from server");clientSocket.close();serverSocket.close();}
}
客户端代码
import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 8080);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out.println("Hello from client");String response = in.readLine();System.out.println("Received from server: " + response);socket.close();}
}
UDP Socket 编程
UDP 是一种无连接的协议,传输速度快但不可靠。以下是 UDP Socket 的基本实现方式:
服务器端代码
import java.net.*;public class UDPServer {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(8080);byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String message = new String(packet.getData(), 0, packet.getLength());System.out.println("Received from client: " + message);InetAddress clientAddress = packet.getAddress();int clientPort = packet.getPort();String response = "Hello from server";byte[] responseData = response.getBytes();DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, clientAddress, clientPort);socket.send(responsePacket);socket.close();}
}
客户端代码
import java.net.*;public class UDPClient {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket();InetAddress serverAddress = InetAddress.getByName("localhost");String message = "Hello from client";byte[] sendData = message.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 8080);socket.send(sendPacket);byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received from server: " + response);socket.close();}
}
常见问题与注意事项
- 端口占用:确保端口未被其他程序占用,否则会抛出
BindException
。 - 资源释放:使用完毕后关闭 Socket 和流,避免资源泄漏。
- 异常处理:网络通信可能抛出
IOException
,建议使用try-catch
块处理。 - 多线程:服务器通常需要处理多个客户端连接,可以使用多线程或线程池。
进阶学习
- NIO(非阻塞 IO):Java 提供了
java.nio
包,支持非阻塞 IO,适合高并发场景。 - Netty 框架:基于 NIO 的高性能网络框架,简化了 Socket 编程的复杂性。