0

在套接字的一侧,我知道数据正确地进入了套接字。

我建立了一个连接:

Connection sr = new Connection();
Server server = new Server("NAME", Interger.parseInt(port));
server.setIp(ip);
sr.setServer(server); 

//I know my server connection code is correct because I can send and receive data in 
//other areas of my program just fine

InputStream is = null;

try
{
  is = sr.getChannel().socket().getInputStream();

  BufferedReader br = new BufferedReader(new InputStreamReader(is));
  StringBuffer text = new StringBuffer();

  int k =0;

  while(k != -1)
  {
    k = br.read();
    text.append((char) k);
  }
}
catch(Exception e)
{
  //no errors ever get thrown
}

然后我只收到了大约一半的数据,即我发送的总共 21398 个字节中的 10989 个字节。它读取的字节数会有所不同,但数据总是以 ..., "values": ["我发送的数据结尾,看起来像 , ..., "values": ["", ""]

4

3 回答 3

1

继续阅读,直到获得所有数据。这个问题最近大约每周出现一次。无法保证网络会立即显示您的所有数据。

您需要继续阅读,直到获得所有数据。你怎么知道发送了多少数据?您可能应该在客户端/服务器之间建立一个小协议,定义要发送多少数据,服务器读取那个小标题并继续读取,直到收到完整的消息。

于 2012-08-23T15:16:20.390 回答
1

不知道这是否可以帮助你:

int k =0;

while((k = br.read()) != -1){
   text.append((char) k);
}

1)在您的情况下,它正在检查 next iteration,这可能导致将不可表示的字符(char-1)附加到text.

2)永远不要catch block空着,可能有一些execption

于 2012-08-23T15:22:09.587 回答
-1

因此,因为我的套接字发送端是在 c++ 中,所以我不小心将一个空 ASCII 值传递到套接字中。并且在套接字的 java 端没有记录,如果读取遇到空值,它会将其视为文件结尾。所以它过早地结束了流,因为它达到了空值。

于 2012-08-23T16:22:22.680 回答