Java 封装自己的TCP通信类
公 众 号:木木与代码
本文作者:@MuMu
编写日期:2025年03月09日
本文字数:2978个字符
关注可了解更多的教程。问题或建议,请公众号留言;
TCP
简介
传输控制协议(Transmission Control Protocol, TCP)是互联网协议族中最核心的协议之一,它位于传输层,提供面向连接的服务,确保数据能够可靠地从源端传输到目的端。TCP通过三次握手建立连接,并且在数据传输过程中使用确认、重传、排序等机制保证数据的完整性。
工作机制
- 三次握手:建立连接时,客户端发送SYN包给服务器作为请求;服务器接收到后返回SYN+ACK包表示同意;最后客户端发送ACK包确认,完成连接建立。
- 数据传输:TCP将应用层的数据分割成多个段落,每个段落都包含一个序列号以便接收方重组。同时,每一个数据段都会被对方确认收到。
- 流量控制:通过滑动窗口机制实现,确保发送方不会因过快发送数据而导致接收方无法处理。
- 拥塞控制:根据网络状况动态调整发送速率,避免网络拥堵。
实际应用场景
几乎所有基于互联网的应用程序都依赖于TCP来保证数据的安全和完整传输,比如Web浏览(HTTP/HTTPS)、电子邮件(SMTP、IMAP)以及文件传输(FTP)等。
Java封装通信类
通信状态事件
public interface TcpClientListener {
// 接收消息
void onMessageReceived(String message);
// 发送消息
void onMessageSend(String message);
// 连接状态(连接成功/失败)
void onConnectionStatusChanged(boolean isConnected);
// 连接断开
void onConnectionError(String errorMessage);
}
功能实现
MuMuTcpClient
是一个用于实现客户端与服务器之间通过TCP协议进行通信的Java类。它允许客户端连接到指定IP地址和端口的服务器,发送消息,并接收来自服务器的消息。
connect()
: 建立与服务器的连接,并在一个新的线程中持续监听来自服务器的消息。如果连接失败或者在监听过程中遇到错误,会触发相应的错误回调。sendMessage(String message)
: 向服务器发送一条消息。如果当前无法发送消息(例如连接已断开),则通知监听器更新连接状态。disconnect()
: 断开与服务器的连接,并关闭所有相关的输入输出流。无论操作是否成功都会更新连接状态。getLocalAddress()
和getLocalPort()
: 分别获取本地绑定的IP地址和端口号;
package com.mumu.android.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @Author: MuMu
* @Date: 2025/3/8 10:43
*/
public class MuMuTcpClient {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private final String serverIp;
private final int serverPort;
private final TcpClientListener listener;
private boolean isRunning = false;
public MuMuTcpClient(String serverIp, int serverPort, TcpClientListener listener) {
this.serverIp = serverIp;
this.serverPort = serverPort;
this.listener = listener;
}
public void connect() {
new Thread(() -> {
try {
socket = new Socket(serverIp, serverPort);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream(), "GB2312");
out = new PrintWriter(outputStreamWriter, true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GB2312"));
isRunning = true;
listener.onConnectionStatusChanged(true);
// 持续接收消息
String message;
while (isRunning && (message = in.readLine()) != null) {
listener.onMessageReceived(message);
}
} catch (IOException e) {
e.printStackTrace();
listener.onConnectionError("Connection error: " + e.getMessage()); // 触发错误回调
} finally {
disconnect();
}
}).start();
}
public void sendMessage(String message) {
if (out != null && !out.checkError()) {
new Thread(new Runnable() {
@Override
public void run() {
out.println(message);
listener.onMessageSend(message);
}
}).start();
} else {
listener.onConnectionStatusChanged(false);
}
}
public void disconnect() {
isRunning = false;
try {
if (socket != null) {
socket.close();
}
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
listener.onConnectionStatusChanged(false);
} catch (IOException e) {
e.printStackTrace();
}
}
public String getLocalAddress(){
return socket == null ? "--" : socket.getLocalAddress().getHostAddress();
}
public int getLocalPort(){
return socket == null ? 0 : socket.getLocalPort();
}
}
作者公众号:木木与代码
欢迎关注作者一起讨论和学习。
到此本节文章内容已结束,谢谢您的阅读!
如有问题欢迎一起讨论!
结束
♥♥♥关注我们♥♥♥