在 .Net 中通过 TCP 发送大文件

jbbarnes77

我需要通过 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过TCP / IP .NET CF发送文件

来自分类Dev

在Qt中通过TCP传输大文件

来自分类Dev

Qt通过TCP发送文件

来自分类Dev

在VB.NET中通过TCP / IP发送数据时程序冻结

来自分类Dev

使用 VB.NET 中的套接字通过 TCP 发送字节数组

来自分类Dev

通过Python中的TCP套接字发送文件

来自分类Dev

通过响应流发送大文件

来自分类Dev

如何绕过发送的TCP最大文件大小?

来自分类Dev

通过TCP套接字发送多个文件

来自分类Dev

Winsock在C中通过TCP发送()

来自分类Dev

通过TCP发送图像

来自分类Dev

如何在C中通过TCP套接字通过HTTP发送文件?

来自分类Dev

如何在C中通过TCP套接字通过HTTP发送文件?

来自分类Dev

如何通过Http Servlet响应发送大文件

来自分类Dev

通过python中的TCP套接字在客户端-服务器之间发送文件?

来自分类Dev

使用C中的套接字通过TCP发送音频文件

来自分类Dev

通过python中的TCP套接字在客户端-服务器之间发送文件?

来自分类Dev

通过TCP / IP发送myObject

来自分类Dev

通过TCP / IP连接发送二进制文件

来自分类Dev

使用C ++通过TCP发送文件,大小错误

来自分类Dev

通过TCP / IP连接发送二进制文件

来自分类Dev

在python中通过TCP服务器网络发送对象

来自分类Dev

通过C中的TCP套接字发送结构

来自分类Dev

通过C ++中的TCP连接发送Opencv Mat

来自分类Dev

在Android应用程序中通过TCP发送图像

来自分类Dev

在Visual C ++中通过TCP发送字符串数据

来自分类Dev

最佳实践 - 在 mongodb 中向客户发送大文件

来自分类Dev

Java:通过TCP传输文件

来自分类Dev

通过Boost TCP传输文件