为什么java tcp套接字在while循环中重复调用时不发送所有数据?

为什么java tcp套接字在while循环中重复调用时不发送所有数据?,java,sockets,tcp,Java,Sockets,Tcp,我正在通过套接字发送数据,但java套接字似乎改变了顺序,数据松散,我无法修复它。 以下是我的java代码: Socket socket; ... while(isSending){ try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); String data = getMyData(); out.writeBytes(data);//data is a csv str

我正在通过套接字发送数据,但java套接字似乎改变了顺序,数据松散,我无法修复它。 以下是我的java代码:

Socket socket;
...
while(isSending){
  try {
    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    String data = getMyData();
    out.writeBytes(data);//data is a csv string parsed on server-side
    out.flush();
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}
Server.cpp:

while(1){
    char recv_buffer[4096];
    memset(recv_buffer,0,4096);
    //receive data from socket
   int ret = recv(socket , recv_buffer , 4095 , 0);
   if (ret == 0){
      error_print("Socket not connected");
      ret = 0;
   } else if (ret < 0) {
      error_print("Error reading from socket!");
      ret = 0;
   }
  if(ret<=0) break;
  recv_buffer[ret]='\0';

  //parse recv_buffer
}
while(1){
字符接收缓冲区[4096];
memset(recv_缓冲区,04096);
//从套接字接收数据
int-ret=recv(套接字,recv_缓冲区,4095,0);
如果(ret==0){
打印错误(“未连接插座”);
ret=0;
}否则如果(ret<0){
打印错误(“从套接字读取错误!”);
ret=0;
}

if(ret正如我所怀疑的。您完全忽略了recv()返回的值函数。它可以是-1表示错误,也可以是零表示流结束,也可以是正整数表示接收的长度。相反,您不仅假设读取已完成,而且还假设它返回一个以null结尾的字符串。

可能您没有像发送一样快地从流中获取数据。您应该显示DarshanLila正在读取数据。@DarshanLila不正是使用TCP套接字时不应该发生的事情吗?它确实发送了所有数据。Java API和Posix需要它。您的接收代码就是错误所在。发布它(编辑到您的问题中)我们会告诉你哪里。@DarshanLila TCP提供流量控制。你的评论没有意义。我添加了详细的服务器代码。如果你知道问题所在的代码,请分享。