Java 网络编程主要基于 java.net 包,它提供了两种主要的网络通信机制:TCP(面向连接)和 UDP(无连接)。下面为你介绍这两种方式的基本实现。
TCP 网络编程示例
TCP 是一种面向连接的通信协议,提供可靠的数据传输。下面是一个简单的客户端 - 服务器示例:
java
// 服务器端代码
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8888)) {
System.out.println("服务器已启动,等待客户端连接...");
Socket socket = serverSocket.accept(); // 监听并接受客户端连接
// 获取输入流,读取客户端发送的数据
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String clientMessage = in.readLine();
System.out.println("客户端消息: " + clientMessage);
// 获取输出流,向客户端发送响应
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("服务器已收到消息: " + clientMessage);
} 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)) {
// 获取输出流,向服务器发送消息
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello, Server!");
// 获取输入流,读取服务器响应
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String serverResponse = in.readLine();
System.out.println("服务器响应: " + serverResponse);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDP 网络编程示例
UDP 是一种无连接的通信协议,不保证数据的可靠传输,但效率较高。以下是 UDP 通信的示例:
java
// 服务器端代码
import java.io.*;
import java.net.*;
public class UDPServer {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket(9999)) {
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
// 接收客户端数据
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket);
String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("客户端消息: " + clientMessage);
// 发送响应给客户端
InetAddress clientAddress = receivePacket.getAddress();
int clientPort = receivePacket.getPort();
String response = "服务器已收到消息: " + clientMessage;
sendData = response.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, clientAddress, clientPort);
socket.send(sendPacket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 客户端代码
import java.io.*;
import java.net.*;
public class UDPClient {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket()) {
InetAddress serverAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
// 发送数据到服务器
String message = "Hello, Server!";
sendData = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, serverAddress, 9999);
socket.send(sendPacket);
// 接收服务器响应
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket);
String serverResponse = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("服务器响应: " + serverResponse);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
关键类说明
-
TCP 相关类:
ServerSocket
:用于创建服务器端套接字,监听指定端口。Socket
:用于创建客户端套接字,或表示服务器端接受的客户端连接。InputStream
/OutputStream
:用于读写数据。
-
UDP 相关类:
DatagramSocket
:用于发送和接收数据报包。DatagramPacket
:表示数据报包,包含数据、目标地址和端口等信息。InetAddress
:表示 IP 地址。