目录
- Socket 概述
- Socket 通信模型
- Socket 编程流程
- DEMO
- 服务器端
- 客户端
在Java中实现服务器和客户端的通信,可以使用Java Socket编程。
Socket 概述
Socket 指的是“插座”,是应用层与传输层之间的桥梁,用于在网络上进行双向通信。在 Socket 编程中,客户端与服务器之间的通信需要通过 Socket 进行实现。客户端通过 Socket 向服务器发送请求,服务器接收请求后返回响应,完成整个通信过程。
Socket 通信模型
Socket 通信模型分为两种:TCP 和 UDP。TCP 是一种可靠的传输协议,它保证了数据的完整性和有序性,适用于需要可靠传输的场景;UDP 是一种无连接的传输协议,它不保证数据的完整性和有序性,适用于实时通信、流媒体传输等场景。
Socket 编程流程
Socket 编程流程一般包括以下几个步骤:
创建 Socket 对象(客户端)或 ServerSocket 对象(服务器)。
绑定 Socket 地址。
启动监听进程(服务器)或连接进程(客户端)。
发送或接收数据。
关闭连接。
DEMO
以下是一个简单的服务器和客户端的例子,它们通过TCP/IP协议通信。
服务器端
Server.java
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
int port = 8085;
try (ServerSocket serverSocket = new ServerSocket(port)){
System.out.println("服务器启动,等待客户端连接...");
while(true) {
try (Socket socket = serverSocket.accept()){
System.out.println("客户端连接成功!");
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);
}
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
Client.java
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
String hostname = "localhost"; // 服务器地址
int port = 8085; // 服务器端口
try (Socket socket = new Socket(hostname, port)) {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("服务器回应: " + in.readLine());
}
} catch (UnknownHostException e) {
System.err.println("未知主机: " + hostname);
e.printStackTrace();
} catch (IOException e) {
System.err.println("I/O错误与主机通信");
e.printStackTrace();
}
}
}
在这个例子中,服务器端监听8085端口,等待客户端的连接。客户端连接到服务器后,可以发送消息给服务器,服务器会将收到的消息原样返回给客户端。这个简单的例子展示了基本的Socket编程,但在实际应用中,你可能需要考虑更复杂的协议(如HTTP或自定义协议)和安全性(如SSL/TLS)。