无法通过 TCP 套接字发送大列表 - 黑莓
Posted
技术标签:
【中文标题】无法通过 TCP 套接字发送大列表 - 黑莓【英文标题】:Unable to send a big list over TCP Sockets - Blackberry 【发布时间】:2011-04-13 05:30:05 【问题描述】:我正在尝试使用 java 服务器和 Blackberry 客户端通过 TCP/IP 套接字发送包含 600 条记录的列表。但是每次到达第 63 条记录时它就会停止,奇怪的是,如果我只发送 200 条记录,它们就可以发送。
我一直无法理解为什么会这样,只有 63 条记录等于大约 4kB,基本上它发送:
一个整数,表示要发送的记录总数 对于每条记录 字符串长度的整数 字符串 字符串终止符“$$$”由于我需要发送整个 600,我尝试关闭 InputStreamReader 并重新打开它,也将其重置但没有任何结果。
有没有其他人经历过这种行为?提前致谢。
编辑
这里是接收的代码:
private String readfromserver() throws IOException
int len=_in.read(); // receives the string length
if (len==0) // if len=0 then the string was empty
return "";
else
char[] input = new char[len+1];
for (int i = 0; i < len; ++i)
input[i] = (char)_in.read();
StringBuffer s = new StringBuffer();
s.append(input);
return s.toString();
private void startRec(String data) throws IOException
boolean mustcontinue=true;
int len=_in.read(); // read how many records is about to receive
if (len==0)
scr.writelog("There is no data to receive");
else
for(int i=0; i<len; i++)
if (mustcontinue)
mustcontinue=mustcontinue && showdata(readfromserver());
else
scr.writelog("Inconsistency error #19");
函数 showdata 只在 LabelField 中显示接收到的字符串。
服务器中的代码:
try
_out.write(smultiple.size()); // send the number of records
_out.flush();
for (int x=0; x<smultiple.size(); x++)
int l=smultiple.elementAt(x).length();
_out.write(l); // send string length
if (l>0)
_out.write(smultiple.elementAt(x)); // send string
_out.flush();
catch (Exception e)
principal.dblog(e.toString());
smultiple 是一个包含字符串的向量,每个人都已经有了终结符 $$$。
谢谢。
【问题讨论】:
这可能与您的问题没有直接关系,但您不需要发送 both 字符串的长度 和 字符串终结者。如果您发送的字符串包含“$$$”怎么办? 您能否在问题中包含相关的黑莓代码? 因为我发送了字符串的长度,所以我只使用终止符来验证我收到的字符串是否正常,这就是我使用它的原因:) 您是否在自己的线程中运行接收代码?如果您在事件线程上运行阻塞操作(从套接字读取),就会发生不好的事情。 @Richard 是的,它有自己的线程,称为 SyncThread。通过每 200 条记录关闭连接并从收到的最后一条记录重新启动,我找到了一个“或多或少的解决方案”。 【参考方案1】:我认为 200 可以,而 600 不行,因为后者的数字大于 255 :-) 你的代码
int len=_in.read();
可能读取的是一个字节而不是整数(4 个字节)
【讨论】:
以上是关于无法通过 TCP 套接字发送大列表 - 黑莓的主要内容,如果未能解决你的问题,请参考以下文章