无法通过 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 套接字发送大列表 - 黑莓的主要内容,如果未能解决你的问题,请参考以下文章

PHP:TCP 套接字,“无法绑定地址”

使用 gen_tcp:send/2 通过套接字发送消息

通过 tcp 套接字发送十六进制值

从内存中打开 PNG 文件并通过 TCP 套接字发送

Faye:即使套接字打开,也无法在浏览器中发送 GET 消息,通过 CURL 工作和响应数据

通过Socket.SendFile发送大文件