1

我正在 VB.NET 中编写一个简单的 TCP 客户端/服务器来传输各种大小的文件。我决定使用 System.Net.Sockets 的命令 SendFile 通过套接字传输字节。

在接收端,我检索字节的代码运行良好,但偶尔传输会随机停止。

我发现通过在检索下一个数据块之间设置一个小的睡眠延迟可以使传输 100% 稳定。

我检索数据的代码(直到没有可用数据)被简化为:

While newSocket.Available > 0
    Threading.Thread.Sleep(100)
    newSocket.ReceiveFrom(data, Remote)
End While

我真的很讨厌使用睡眠延迟,并且认为必须有适当的方法/函数来从 SendFile 检索数据?

4

1 回答 1

1

Socket.Available 返回到目前为止已接收但尚未读取的字节总数。因此,如果您读取数据的速度快于数据的传入速度(这在慢速网络上很可能发生),即使客户端仍在发送数据,也不会再读取数据。

如果客户端为它发送的每个文件都与服务器建立新连接,您可以简单地将其更改为如下内容:

While newSocket.Connected
    If newSocket.Available > 0 Then
        newSocket.ReceiveFrom(data, Remote)
    End If
End While

但是,我建议改用异步调用,例如 BeginReceive。然后,只要有要处理的数据,您的委托就会被调用,而不是在一个恒定的循环中等待。有关示例,请参见此链接:

http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx

于 2012-06-08T15:16:50.640 回答