gpt4 book ai didi

java - Android TCP 连接到 C 服务器 : String transferred is noisy

转载 作者:可可西里 更新时间:2023-11-01 02:42:22 25 4
gpt4 key购买 nike

这对我来说是一个相对乏味的问题,亲爱的 helper ,请允许我引导您完成它。

我正在通过 TCP 套接字将几个字符串从 C 服务器发送到 Java Android 应用程序。我在 Android 方面的第一个解决方案如下(为便于阅读而简化):

protected void receiveMessage() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String buffer;
while ((buffer = br.readLine()) == null) {} //This is blocking, unless a line is read
dispatch(buffer);
catch(...){}
}

这是在线程中运行的,并且工作正常。唯一的问题是,它根本无法通过压力测试。当连续发送几条消息时,它会跳过大部分(我认为它只处理第一条)。在每个发送任务之间强制执行 sleep(1) 是可行的。

第二种解决方案,使用 StringBuilder,允许我捕获套接字之间的所有内容:

StringBuilder total = new StringBuilder(inputStream.available());
String line;
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
while((line = bufferedReader.readLine()) != null) {
total.append(line).append('\n');
}

但是:

  1. 它永远不会跳出 while 指令
  2. 缓冲区很嘈杂,尽管一切都在那里

这是第二个解决方案的 logcat 示例,第一条消息正常并且可以由调度程序处理,然后它变得可疑,第三条正常,第四条又坏了,等等

05-20 16:26:56.901 10082-10204/com.myapp D/RECEIVER: RECEIVING
05-20 16:26:56.901 10082-10204/com.myapp D/RECEIVER: line={ "action": 20, "data": [ { "id": 100, "addr": 64, "pin": 0, "state": true, "name": "Ecumeur" }, { "id": 101, "addr": 64, "pin": 1, "state": false, "name": "Brasseurs" } ]}
05-20 16:26:56.901 10082-10204/com.myapp D/RECEIVER: RECEIVING
05-20 16:26:56.901 10082-10204/com.myapp D/RECEIVER: line=���������������������������� ���������������������������������������������~�_������_��������������������������������X�������x;~�_���� ;~�_����������������x;~�_����'������������b@�����������J�_����@������_������������������P��������+V�_������������������X��������i���O���������������������A������@������������������������������������]

我应该如何以好的方式做到这一点?非常感谢您的回复!

最佳答案

我将跳过您的第一次尝试,乍一看似乎非常错误。你的第二次尝试更接近了但是......你没有做任何事情来告诉(android)客户端你已经到达消息的末尾。

如果 (C) 服务器要关闭连接,这会将 android 踢出循环,因为它会到达 InputStream 的末尾,这会导致缓冲读取器返回 null。然后它会结束循环并继续处理。


如果您想保持连接打开,那么您必须从服务器发送一个标记(例如:在一行中发送字符串“EOF”并让 android 检查该标记的每一行)。

例如:

StringBuilder total = new StringBuilder(inputStream.available());
String line;
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
while((line = bufferedReader.readLine()) != null && !line.equals("EOF")) {
total.append(line).append('\n');
}

为此,服务器必须在一行中发送字符串 "EOF" 以告知 android 消息已结束。


我认为数据噪音是由于 C 发送了它不应该发送的内容引起的。从你的问题中不清楚这是什么原因。

关于java - Android TCP 连接到 C 服务器 : String transferred is noisy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37350173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com