Java 提供了强大的网络编程能力,支持 TCP/IP 和 UDP 协议。
Socket 编程基础
// 服务器端代码
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8888)) {
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端连接成功: " + clientSocket.getInetAddress());
// 处理客户端请求
new ClientHandler(clientSocket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientHandler extends Thread {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
String message;
while ((message = in.readLine()) != null) {
System.out.println("收到客户端消息: " + message);
out.println("服务器回复: " + message.toUpperCase());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 客户端代码
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8888);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader userInput = new BufferedReader(
new InputStreamReader(System.in))) {
System.out.println("已连接到服务器,请输入消息:");
String userMsg;
while ((userMsg = userInput.readLine()) != null) {
if ("exit".equalsIgnoreCase(userMsg)) break;
out.println(userMsg);
String response = in.readLine();
System.out.println("服务器响应: " + response);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDP 编程
// UDP 服务器
import java.net.*;
public class UDPServer {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket(8888)) {
System.out.println("UDP 服务器启动...");
byte[] buffer = new byte[1024];
while (true) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到来自 " + packet.getAddress() + " 的消息: " + message);
// 回复客户端
String response = "UDP 服务器已收到: " + message;
byte[] responseData = response.getBytes();
DatagramPacket responsePacket = new DatagramPacket(
responseData, responseData.length, packet.getAddress(), packet.getPort());
socket.send(responsePacket);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// UDP 客户端
import java.net.*;
import java.util.Scanner;
public class UDPClient {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket();
Scanner scanner = new Scanner(System.in)) {
InetAddress serverAddress = InetAddress.getByName("localhost");
System.out.println("UDP 客户端启动,请输入消息:");
while (true) {
String message = scanner.nextLine();
if ("exit".equalsIgnoreCase(message)) break;
// 发送消息
byte[] sendData = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, serverAddress, 8888);
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("服务器回复: " + response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。