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 编程的复杂性。
16万+

被折叠的 条评论
为什么被折叠?



