使用消息边界标记解决TCP粘包问题的示例代码 -- 知识铺
下面是一个简单的示例,演示如何使用消息边界标记解决 TCP 粘包问题。在这个示例中,消息边界标记是换行符 \n
。
服务端代码:
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
final int PORT = 8888;
try {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server started...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected: " + clientSocket);
// 创建一个新线程处理客户端连接
Thread clientThread = new Thread(new ClientHandler(clientSocket));
clientThread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String line;
StringBuilder message = new StringBuilder();
while ((line = in.readLine()) != null) {
if (line.isEmpty()) {
// 遇到空行表示消息结束,处理完整消息
handleMessage(message.toString(), out);
message.setLength(0); // 清空消息缓冲区
} else {
message.append(line).append("\n"); // 将数据添加到消息缓冲区
}
}
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void handleMessage(String message, PrintWriter out) {
// 在这里处理完整消息,示例中只是简单地将收到的消息原样返回给客户端
System.out.println("Received from client: " + message);
out.println("Echo: " + message);
}
}
客户端代码:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
final String SERVER_IP = "127.0.0.1"; // 服务器 IP 地址
final int SERVER_PORT = 8888; // 服务器端口号
try {
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
System.out.println("Connected to server...");
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = userInput.readLine()) != null) {
out.println(line); // 将用户输入发送给服务器
String response = in.readLine(); // 读取服务器的回复
System.out.println("Server response: " + response);
}
userInput.close();
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个示例中,服务端在处理客户端发送的数据时,会等待读取到空行,表示一个完整的消息结束。然后将完整的消息传递给 handleMessage()
方法进行处理。这样可以确保每个消息都是完整的,避免了粘包问题。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240505/%E4%BD%BF%E7%94%A8%E6%B6%88%E6%81%AF%E8%BE%B9%E7%95%8C%E6%A0%87%E8%AE%B0%E8%A7%A3%E5%86%B3TCP%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98%E7%9A%84%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com