Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在接收端引入睡眠时,接收端未完全接收到数据_Sockets_Tcp - Fatal编程技术网

Sockets 在接收端引入睡眠时,接收端未完全接收到数据

Sockets 在接收端引入睡眠时,接收端未完全接收到数据,sockets,tcp,Sockets,Tcp,我正在使用一个使用tcp套接字的文件传输应用程序。在正常情况下,当我尝试使用应用程序发送文件时,会收到完整的文件,但当我在收到的每个数据包之间放置40毫秒的睡眠时间时,我只收到部分文件。在将完整的文件发送到输出流之后,我还将立即关闭套接字。我没有收到完整文件的可能原因是什么?。下面是发送方和接收方的代码。提前谢谢 /////////////////////////Sender Side//////////////////////////// bytesLeft = fileSize; whil

我正在使用一个使用tcp套接字的文件传输应用程序。在正常情况下,当我尝试使用应用程序发送文件时,会收到完整的文件,但当我在收到的每个数据包之间放置40毫秒的睡眠时间时,我只收到部分文件。在将完整的文件发送到输出流之后,我还将立即关闭套接字。我没有收到完整文件的可能原因是什么?。下面是发送方和接收方的代码。提前谢谢

/////////////////////////Sender Side////////////////////////////

bytesLeft = fileSize;
while(bytesLeft > 0) 
{
    try 
    {
        bytesRead = fileInpStream.read(buffer, 0, BUFFERSIZE);
        outStream.write(Arrays.copyOfRange(buffer, 0, bytesRead));
    } 
    catch (IOException e) 
    {
        try 
        {
             fileInpStream.close();
        } 
        catch (IOException e1) 
        {
            Log.i(LOGC, "Error " + e1.getMessage());
            e1.printStackTrace();
            disconnect();
            return;
        }
    }
    bytesLeft -= bytesRead;
    if (bytesLeft < 1) 
    {
      try 
      {
        fileInpStream.close();
      } 
      catch (IOException e) 
      {
        e.printStackTrace();
      }
    }
}
//Closing the socket immediately after all the data are sent to out stream.
try 
{
    socket.close();
} 
catch (StcException e) 
{
    e.printStackTrace();
}


/////////////////Receiver Side//////////////////////////

bytesLeft = filesize;
while (bytesLeft > 0) 
{
    try 
    {
      if (bytesLeft < BUFFERSIZE)
        readAmount = (int) bytesLeft;
      bytesRead = inpstream.read(buf, 0, readAmount);
      if (bytesRead < 1) 
      {
        fileoutputstream.close();
      }
      fileoutputstream.write(Arrays.copyOfRange(buf, 0,bytesRead));
      bytesLeft -= bytesRead;

      //Including a sleep of 40 ms or more doesnt completely receive the data.
      //try{ sleep(40) } catch(Exception e){ }

      if (bytesLeft == 0) 
      {
        fileoutputstream.close();
      }
    } 
    catch (IOException e) 
    {
      try 
      {
        fileoutputstream.close();
      } 
      catch (IOException e1) 
      {
        e1.printStackTrace();
      }
    } 
}
//发送方////////////////////////////
bytesLeft=文件大小;
while(字节左>0)
{
尝试
{
bytesRead=fileInpStream.read(buffer,0,BUFFERSIZE);
outStream.write(Arrays.copyOfRange(buffer,0,bytesRead));
} 
捕获(IOE异常)
{
尝试
{
fileInpStream.close();
} 
捕获(IOE1异常)
{
Log.i(LOGC,“Error”+e1.getMessage());
e1.printStackTrace();
断开连接();
返回;
}
}
字节左-=字节读;
if(字节左<1)
{
尝试
{
fileInpStream.close();
} 
捕获(IOE异常)
{
e、 printStackTrace();
}
}
}
//将所有数据发送到out stream后立即关闭套接字。
尝试
{
socket.close();
} 
捕获(标准异常e)
{
e、 printStackTrace();
}
/////////////////接收端//////////////////////////
bytesLeft=文件大小;
while(字节左>0)
{
尝试
{
if(字节左<缓冲区大小)
readAmount=(int)字节左;
bytesRead=inpstream.read(buf,0,readAmount);
如果(字节读取<1)
{
fileoutputstream.close();
}
write(Arrays.copyOfRange(buf,0,bytesRead));
字节左-=字节读;
//包括40毫秒或更长时间的睡眠不能完全接收数据。
//试试{sleep(40)}catch(异常e){}
if(bytesleet==0)
{
fileoutputstream.close();
}
} 
捕获(IOE异常)
{
尝试
{
fileoutputstream.close();
} 
捕获(IOE1异常)
{
e1.printStackTrace();
}
} 
}

你根本不需要睡觉。别说了。这简直是浪费时间。您的代码比需要复杂好几倍,并且可能掩盖了一些潜在的bug。这:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
out.close();

两端都足够了。

谢谢您的回复,但是代码在没有睡眠的情况下工作得非常好。我实施这个睡眠是为了重现错误,看看哪里出了问题?。我之所以使用sleep,是因为在接收到文件后会进行很多后期处理,这需要一些时间。想象一下,如果您为收到的每个文件发送100个空文件,那么作为后期处理的一部分,接收方会有延迟。我在不关闭流的情况下关闭了发送器上的套接字,但是在关闭之前我确实关闭了输入/输出,这会有什么不同吗?在您拥有它的地方仍然是没有意义的。仅仅降低下载部分的速度并不能准确地再现后处理延迟。在收到文件后,将睡眠移动到,以便测试真实的内容。您应该关闭输出流,而不是套接字,并且不需要任何关闭。谢谢EJP。我关闭了输出流,它工作了,但是我的接收方没有接收read()=-1,即使在关闭发送方的套接字之后也是如此。发送方发送字节,并在所有字节发出后立即关闭套接字,而在接收方,由于存在延迟,它在20秒后完成接收字节,但我没有接收到-1。我还进行了调试,以查看接收到了什么值,但当我执行inputstream.read(buffer)时,控件就消失了。未捕获任何异常。我还了解到tcp的Close_wait状态与此相关。谢谢