- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这对我来说是一个相对乏味的问题,亲爱的 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');
}
但是:
这是第二个解决方案的 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/
I made an example , 我直接从 jQuery website 复制了它然而,它不会转移.. HTML: BLAHHHH
所以我对名字有一些误解STATE TRANSFER在 REPRESENTATIONAL STATE TRANSFER. 是 state transfer意味着传输当前时间实例中服务器中存在的资源的表示
我的代码将文件从远程服务器下载到我们的服务器。 通常,一个文件最多需要一分钟左右的时间才能完成下载。但有时下载时间会超过 5 分钟。 如果当前下载时间超过 5 分钟,是否可以重新开始下载? Tamir
Representational State Transfer中的State Transfer是指什么? 找到了一些关于这个的解释(例如 here )但我还是不明白。例如文章中说 The repres
在阅读 C# 时,我遇到了“数据传输类型”和“数据传输对象”这两个术语。这显示在匿名类型周围,其中动态创建类型以保存结果,例如来自 LINQ。这两个术语指的是同一件事吗? 谢谢, 斯科特 最佳答案 我
以下代码: public string add_button_tooltip_markup { get { return add_button.get_tooltip_markup (); }
您可以在下面看到外部测试人员的测试已关闭: 内部测试相同: 但是当我转移应用程序时,不满足其中一个条件: 为什么? 最佳答案 我遇到了完全相同的问题,通过如上所述从 TestFlight 中删除所有
我对 Java 和 REST/REST 很陌生。我正在尝试创建一个设置了“Transfer-Encoding: chunked”的 POST 请求(通过 header ),但出现异常“org.apac
我是 mysql 新手,想知道我在代码中会怎么说。如果 Narrive = "transfer"则将 AccountID 更改为 2001 请有人给我一步一步的说明,并请解释一下我会将这段代码放在哪里
我有一个对象是数据库查询的结果,看起来像这样(var_dump 输出): object(stdClass)#17 (6) { ["id"]=> string(1) "1" ["title"
使用方法 Server.Transfer("default.aspx")以获得更好的在网站内导航的性能。当我使用它时,它不会更改地址栏中的 url。如何通过 server.transfer 获取新 u
我正在使用 lftp 将文件从本地传输到仅允许 SFTP 访问的远程服务器。 我使用以下语法来传输文件: lftp -c "open -u $UN,$Pass sftp://$Server ; mir
使用我编写的FTP客户端,有时上传完成后,有时会从FileZilla服务器收到226 Transfer OK消息,有时我什么也收不到。并不是在收到226 Transfer OK之前客户端已断开连接,因
我的 Chrome 应用程序和一个简单的设备之间没有发生任何类型的传输,只是等待数据进入其 uart rx 线路。设备接口(interface)的端点类型为bulk,尽管我已经尝试了所有可用的传输类型
我正在通过 SFTP 和 FileZilla 传输一个非常大的 (35GB) 文件。 现在传输已完成59.7%,但我不断收到此错误,并且几个小时内该数字都没有更改。 Error: File t
经过大量研究,我仍然没有答案。 我使用 WebForm 应用程序 VS 2013。 我的代码相当简单: Server.Transfer("~/Success.aspx",true); 此后,执行 Su
抱歉,标题令人困惑;然而,描述和插图应该可以解决这个问题。 本质上,我有表 A 表示表 B 的行之间“金额”转移的实例。 我希望加入 A 和 B 以便我可以显示转帐的详细信息: ===========
我正在使用 iOS 版 Plaid API 编写一个程序,该程序在身份验证后访问银行帐户并显示交易数据。 我需要知道是否可以在帐户之间转移资金(支票到储蓄)以及如何转移。 我知道 acorns 使用相
我需要通过同一网络在不同计算机之间复制/传输一些文件。经过一些阅读和搜索后,我认为尝试 Java 的 jsch 可能是一个不错的选择。令人痛苦的事实是,可能没有针对 jsch 的好的文档。但据我所知,
我正在使用 XMLHttpRequest 读取 json 文件,发现“通过网络传输”明显大于资源大小。 xmlhttp.open("GET", "resources.json", true); 而其他
我是一名优秀的程序员,十分优秀!