Vb.net 使用System.Net.Sockets SendFile后检索数据
我正在VB.NET中编写一个简单的TCP客户机/服务器,以传输各种大小的文件。我决定使用System.Net.Sockets的命令SendFile通过套接字传输字节 在接收端,我检索字节的代码工作得相当好,但有时传输会随机停止 我发现,通过在检索下一个数据块之间设置一个小的睡眠延迟,可以使传输100%稳定 我检索数据(直到没有可用数据)的代码简化如下:Vb.net 使用System.Net.Sockets SendFile后检索数据,vb.net,sockets,sendfile,Vb.net,Sockets,Sendfile,我正在VB.NET中编写一个简单的TCP客户机/服务器,以传输各种大小的文件。我决定使用System.Net.Sockets的命令SendFile通过套接字传输字节 在接收端,我检索字节的代码工作得相当好,但有时传输会随机停止 我发现,通过在检索下一个数据块之间设置一个小的睡眠延迟,可以使传输100%稳定 我检索数据(直到没有可用数据)的代码简化如下: While newSocket.Available > 0 Threading.Thread.Sleep(100) new
While newSocket.Available > 0
Threading.Thread.Sleep(100)
newSocket.ReceiveFrom(data, Remote)
End While
我真的很讨厌使用睡眠延迟,我认为必须有一个合适的方法/函数从SendFile中检索数据?Socket.Available返回到目前为止已接收到但尚未读取的字节总数。因此,如果你读的数据快于它的到来(在一个缓慢的网络上是完全可能的),即使客户端仍处于发送数据的中间,也不会有更多的数据被读取。 如果客户机为其发送的每个文件与服务器建立新连接,您只需将其更改为以下内容:
While newSocket.Connected
If newSocket.Available > 0 Then
newSocket.ReceiveFrom(data, Remote)
End If
End While
但是,我建议使用异步调用,例如BeginReceive。然后,一旦有数据要处理,就会调用您的委托,而不是在一个常量循环中等待。有关示例,请参见此链接:
Socket.Available返回到目前为止已接收但尚未读取的字节总数。因此,如果你读的数据快于它的到来(在一个缓慢的网络上是完全可能的),即使客户端仍处于发送数据的中间,也不会有更多的数据被读取。 如果客户机为其发送的每个文件与服务器建立新连接,您只需将其更改为以下内容:
While newSocket.Connected
If newSocket.Available > 0 Then
newSocket.ReceiveFrom(data, Remote)
End If
End While
但是,我建议使用异步调用,例如BeginReceive。然后,一旦有数据要处理,就会调用您的委托,而不是在一个常量循环中等待。有关示例,请参见此链接:
使用这种方法,无疑是一种平稳的转移。当我学到更多的时候,我会看看BeginReceive。谢谢使用这种方法绝对是一种平稳的转移。当我学到更多的时候,我会看看BeginReceive。谢谢