在Java中,通过套接字(Socket)进行网络通信是一种常见的技术,用于客户端和服务器之间的数据交换。以下是一个简单的实例,展示如何使用Java的Socket
类和ServerSocket
类来实现客户端-服务器通信。
服务端代码
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
int port = 12345; // 服务器端口号
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is listening on port " + port);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New client connected");
new ServerThread(socket).start();
}
} catch (IOException ex) {
System.out.println("Server exception: " + ex.getMessage());
ex.printStackTrace();
}
}
}
class ServerThread extends Thread {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try (InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true)) {
String text;
while ((text = reader.readLine()) != null) {
System.out.println("Received from client: " + text);
writer.println("Server: " + text);
}
} catch (IOException ex) {
System.out.println("Server exception: " + ex.getMessage());
ex.printStackTrace();
}
}
}
客户端代码
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
String hostname = "localhost";
int port = 12345;
try (Socket socket = new Socket(hostname, port)) {
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = consoleReader.readLine()) != null) {
writer.println(userInput);
String response = reader.readLine();
System.out.println(response);
}
} catch (UnknownHostException ex) {
System.out.println("Server not found: " + ex.getMessage());
} catch (IOException ex) {
System.out.println("I/O error: " + ex.getMessage());
}
}
}
代码说明
-
服务端代码:
ServerSocket
类用于创建服务器套接字,监听指定端口上的连接。ServerSocket.accept()
方法阻塞,直到客户端连接。- 每当一个客户端连接,创建一个新的线程(
ServerThread
)处理该连接。 ServerThread
类读取客户端发送的数据并回显回客户端。
-
客户端代码:
Socket
类用于创建客户端套接字,连接到指定主机和端口。- 通过
PrintWriter
向服务器发送数据,通过BufferedReader
接收服务器的响应。 - 从控制台读取用户输入,并将其发送到服务器,打印服务器的响应。
使用方法
- 运行服务端:先运行
Server
类,它会在指定端口上监听客户端连接。 - 运行客户端:然后运行
Client
类,连接到服务器并发送数据。 - 交互:在客户端控制台输入数据,服务器会接收并回显数据。
这种简单的客户端-服务器模型可以扩展,以处理更复杂的通信需求,比如多线程、加密、协议处理等。