我需要通过 TCP 发送大文件(> 50 兆)。我已经搜索了所有发布的问题和答案,但还没有找到可行的解决方案。当我尝试发送时,我的发送程序发送了几个数据包,然后中止并出现以下错误:System.IO.IOException:无法将数据写入传输连接:主机中的软件中止了一个已建立的连接。
至于我的接收客户端,Listener.Pending() 状态始终为 false,因此它从不读取任何数据包。我的代码非常接近工作,但我需要一些鹰眼来查看它并提供帮助。
Public Sub SendTCPFile(Address As String, ModelName As String, FileName As String)
Dim SendingBuffer As Byte() = Nothing
Dim Client As TcpClient = Nothing
Dim NetStream As NetworkStream = Nothing
Dim BufferSize As Integer = 1024
Try
Client = New TcpClient(Address, PortNumber)
NetStream = Client.GetStream()
Dim FS As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read)
Dim NumberOfPackets As Integer = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(FS.Length) / Convert.ToDouble(BufferSize)))
Dim CurrentPacketLength As Integer, TotalLength As Integer = CInt(FS.Length), counter As Integer = 0
For i As Integer = 0 To NumberOfPackets - 1
If TotalLength > BufferSize Then
CurrentPacketLength = BufferSize
TotalLength = TotalLength - CurrentPacketLength
Else
CurrentPacketLength = TotalLength
End If
SendingBuffer = New Byte(CurrentPacketLength) {}
FS.Read(SendingBuffer, 0, CurrentPacketLength)
NetStream.Write(SendingBuffer, 0, CInt(SendingBuffer.Length))
Next
FS.Close()
Catch ex As Exception
WriteLog("EXCEPTION in SendTCPFile")
Finally
NetStream.Close()
Client.Close()
End Try
End Sub
Public Sub ReceiveTCPFile(Address As String, ModelName As String)
Dim Listener As TCPListener = Nothing
Try
Listener = New TcpListener(IPAddress.Any, PortNumber)
Listener.Start()
Catch ex As Exception
WriteLog("EXCEPTION in SendTCPFile")
EndTry
Dim BufferSize As Integer = 1024
ReceivingBuffer = New Byte(BufferSize) {}
Dim BytesReceived As Integer
While True
Dim Client As TcpClient = Nothing
Dim NetStream As NetworkStream = Nothing
Try
If Listener.Pending() Then
Client = Listener.AcceptTcpClient()
NetStream = Client.GetStream()
Dim FS As FileStream = New FileStream(SaveFileName, FileMode.OpenOrCreate, FileAccess.Write)
While (BytesReceived = NetStream.Read(ReceivingBuffer, 0, ReceivingBuffer.Length)) > 0
FS.Write(ReceivingBuffer, 0, BytesReceived)
End While
FS.Close()
NetStream.Close()
Client.Close()
End If 'Listener.Pending
Catch ex As Exception
WriteLog("EXCEPTION in SendTCPFile")
NetStream.Close()
End Try
End While
End Sub 'ReceiveTCPFile
您不需要NumberOfPackets
在发送方进行计算。继续阅读FileStream
直到到达 EOF,发送您阅读的任何内容。就像您在接收端所做的一样,当您继续阅读直到断开连接时,将收到的任何内容写入文件。
Public Sub SendTCPFile(Address As String, ModelName As String, FileName As String)
Dim Client As TcpClient = Nothing
Dim NetStream As NetworkStream = Nothing
Try
Client = New TcpClient(Address, PortNumber)
NetStream = Client.GetStream()
Dim FS As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read)
Dim BufferSize As Integer = 1024
Dim SendingBuffer As Byte() = New Byte(BufferSize) {}
Dim PacketLength As Integer = 0
While (PacketLength = FS.Read(SendingBuffer, 0, SendingBuffer.Length)) > 0
NetStream.Write(SendingBuffer, 0, PacketLength)
End While
FS.Close()
Catch ex As Exception
WriteLog("EXCEPTION in SendTCPFile")
Finally
NetStream.Close()
Client.Close()
End Try
End Sub
至于您的Listener.Pending
问题,那只能意味着您的客户端从不尝试连接到服务器,因此服务器无法接受任何连接。在服务器接受连接之前,您无法向服务器发送数据。TcpClient
如果无法建立连接,构造函数会引发异常。因此,如果构造函数没有失败,但Pending
始终为 false,则客户端必须连接到您自己的服务器之外的其他服务器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句