从java中的套接字读取时出错

时间:2012-08-23 15:00:57

标签: java sockets

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

我建立了一个连接:

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": ["", ""]就是{。}}。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

int k =0;

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

1)在你的情况下,它正在检查下一个iteration,这可能会导致在{{1}的末尾附加不可表示的字符(char为-1) }。

2)永远不要让text为空,可能有一些catch block

答案 2 :(得分:-1)

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