基于TCP与多线程的无线外设数据通信实现
在前一阶段完成了Windows服务端与Android客户端之间的网络连接建立,本节将重点实现双方间的数据传输逻辑。
Android端发送线程的核心代码如下(SendThread.java):
package com.hzhi.mouse_mb;
import java.io.DataOutputStream;
import java.net.Socket;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
public class SendThread extends Thread {
private Socket clientSocket;
private String pendingData;
private DataOutputStream output;
private Message uiMessage;
private Bundle dataBundle;
public SendThread(Socket socket) {
this.clientSocket = socket;
}
public void setData(String data) {
this.pendingData = data;
}
@Override
public void run() {
try {
output = new DataOutputStream(clientSocket.getOutputStream());
} catch (Exception e) {
notifyError(e.getMessage());
return;
}
while (!isInterrupted()) {
if (pendingData == null) {
continue;
}
try {
output.writeUTF(pendingData);
Log.d("SEND", "发送数据: " + pendingData);
pendingData = null; // 清空待发数据
} catch (Exception e) {
notifyError("发送失败: " + e.getMessage());
break;
}
}
}
private void notifyError(String errorMsg) {
uiMessage = new Message();
dataBundle = new Bundle();
dataBundle.putString("error", errorMsg);
uiMessage.what = 1001;
uiMessage.setData(dataBundle);
MainActivity.main_handler.sendMessage(uiMessage);
}
}
该线程通过 clientSocket.getOutputStream() 获取输出流,并封装为 DataOutputStream。在循环中持续检查是否有待发送的数据(pendingData),若有则调用 writeUTF() 将字符串内容写入底层网络通道,实现向服务端的数据推送。
对应地,Windows服务端的接收处理线程(tReceive.java)如下:
import java.io.DataInputStream;
import java.net.Socket;
public class tReceive extends Thread {
private Socket connection;
private DataInputStream input;
private String receivedMessage;
public tReceive(Socket socket) {
this.connection = socket;
}
@Override
public void run() {
try {
input = new DataInputStream(connection.getInputStream());
} catch (Exception e) {
fMain.l_status.setText("连接异常: " + e.getMessage());
return;
}
while (!isInterrupted()) {
try {
receivedMessage = input.readUTF();
System.out.println("接收到消息: " + receivedMessage);
fMain.rbt_act(receivedMessage); // 触发本地操作
} catch (Exception e) {
fMain.l_status.setText("读取错误: " + e.getMessage());
break;
}
}
}
}
服务端通过 connection.getInputStream() 创建 DataInputStream,用于从网络流中读取数据。readUTF() 方法会阻塞等待客户端发送的完整字符串,解析后交由 rbt_act() 处理,完成对输入事件的响应。
整个通信流程依赖于可靠的TCP连接与独立线程管理,确保数据实时、有序传递。