Vb.net 我编写的文件发送程序出错

Vb.net 我编写的文件发送程序出错,vb.net,tcp,file-transfer,Vb.net,Tcp,File Transfer,有人能提出以下两个项目的问题吗?出于某种原因,它似乎接收的字节比发送的字节多。谢谢 要接收的代码: Imports System.Threading Imports System.Net Imports System.Net.Sockets Imports System.IO Public Class Form1 'Dim SumBytes As Integer = 0 Private Sub Form1_Load(sender As Object, e As Event

有人能提出以下两个项目的问题吗?出于某种原因,它似乎接收的字节比发送的字节多。谢谢

要接收的代码:

Imports System.Threading
Imports System.Net
Imports System.Net.Sockets
Imports System.IO

Public Class Form1

    'Dim SumBytes As Integer = 0


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ProcessIt As New Thread(AddressOf Process)
        ProcessIt.IsBackground = True
        ProcessIt.Start()
    End Sub

    Private Sub Process()
        Dim ServerInst As New TcpListener(8000) 'port to receive instructions
        Dim ClientInst As TcpClient

        ServerInst.Start()
        ClientInst = ServerInst.AcceptTcpClient
        Dim netStream As NetworkStream = ClientInst.GetStream
        Dim valid As Boolean = True
        Dim number As Integer 'number of packets
        Dim TotalNumberOfBytes As Integer
        Dim FilePath As String
        Dim portN As ULong

        While valid = True
            Dim buffer(10024 - 1) As Byte
            Dim bytesRead As Integer = netStream.Read(buffer, 0, buffer.Length)

            number = BitConverter.ToInt64(buffer, 0)

            TotalNumberOfBytes = BitConverter.ToUInt64(buffer, 8)

            portN = BitConverter.ToInt64(buffer, 16)

            FilePath = System.Text.Encoding.ASCII.GetString(buffer, 25, buffer(24)) 'filename


            If My.Computer.FileSystem.FileExists("C:\Test" & FilePath) Then
                'Dim info2 As New FileInfo(FolderPath & FilePath)
                'Dim length2 As Long = info2.Length

                'If Math.Ceiling(length2 / 10023) <> number Then
                '    netStream.Flush()
                '    ReDim buffer(10023)
                '    buffer(0) = Math.Ceiling(length2 / 10023)
                '    netStream.Write(buffer, 0, buffer.Length)
                '    Directory.CreateDirectory(Path.GetDirectoryName(FolderPath & FilePath))
                '    writer = New BinaryWriter(System.IO.File.Open(FolderPath & FilePath, FileMode.Append))
                '    ProcessFile(FolderPath & FilePath, netStream, buffer, Math.Ceiling(length2 / 10024), writer)
                'Else
                '    netStream.Flush()
                '    ReDim buffer(10023)
                '    buffer(0) = 0
                '    buffer(1) = 1
                '    netStream.Write(buffer, 0, buffer.Length)
                'End If
            Else
                'netStream.Flush()
                'ReDim buffer(10023)
                'buffer(0) = 0
                'netStream.Write(buffer, 0, buffer.Length)

                Directory.CreateDirectory(Path.GetDirectoryName("C:\Test" & FilePath))
                'writer = New BinaryWriter(System.IO.File.Open(FolderPath & FilePath, FileMode.Create))
                'ProcessFile(FolderPath & FilePath, netStream, buffer, 0, writer)
            End If

            Dim rec As New ReceiveFile(FilePath, 8001, number)

        End While

    End Sub

    Public Class ReceiveFile
        Public Sub New(ByVal FilePath As String, ByVal port As Integer, ByVal numberOfPackets As Integer)
            'Constructor

            Dim ServerInstance As New TcpListener(port) 'port to receive file
            ServerInstance.Start()
            Dim ClientInstance As TcpClient = ServerInstance.AcceptTcpClient
            Dim netStreamInstance As NetworkStream = ClientInstance.GetStream
            Dim Buffer(10034) As Byte
            Dim writer As BinaryWriter = New BinaryWriter(System.IO.File.Open("C:\Test" & FilePath, FileMode.Create))
            Dim count As Integer = 0
            Dim buff2(0) As Byte

            Do While True


                Dim bytesRead As ULong


                Try
                    bytesRead = netStreamInstance.Read(Buffer, 0, Buffer.Length)
                Catch ex As Exception
                    End
                End Try

                If System.Text.Encoding.ASCII.GetString(Buffer, 0, 11) <> "PenSendProc" Then
                    Continue Do
                End If


                Dim BufferData(UBound(Buffer) - 11) As Byte


                For i = 0 To UBound(BufferData)
                    BufferData(i) = Buffer(i + 11)
                Next

                If count = numberOfPackets - 2 Then
                    ReDim Preserve BufferData(bytesRead - 1 - 11)
                    writer.Write(BufferData)
                    netStreamInstance.Write(buff2, 0, buff2.Length)
                    Exit Do
                End If

                writer.Write(BufferData)
                netStreamInstance.Flush()
                netStreamInstance.Write(buff2, 0, buff2.Length)

                count += 1

            Loop

            writer.Close()
            netStreamInstance.Write(buff2, 0, buff2.Length)
            ServerInstance.Stop()
            ClientInstance.Close()
        End Sub
    End Class

End Class
导入系统线程
导入系统.Net
导入System.Net.Sockets
导入System.IO
公开课表格1
'Dim SumBytes As Integer=0
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
Dim ProcessIt作为新线程(进程地址)
ProcessIt.IsBackground=True
ProcessIt.Start()
端接头
私有子进程()
Dim服务器安装为新的TcpListener(8000)端口,用于接收指令
Dim ClientInstant作为TCP客户端
ServerInst.Start()
ClientInst=ServerInst.AcceptTcpClient
将netStream设置为NetworkStream=ClientInst.GetStream
Dim有效值为布尔值=True
Dim number作为整数的数据包数
Dim TotalNumberOfBytes为整数
将文件路径设置为字符串
乌龙港
而valid=True
Dim缓冲区(10024-1)作为字节
Dim bytesRead As Integer=netStream.Read(buffer,0,buffer.Length)
number=BitConverter.ToInt64(缓冲区,0)
TotalNumberOfBytes=BitConverter.ToUInt64(缓冲区,8)
portN=BitConverter.ToInt64(缓冲区,16)
FilePath=System.Text.Encoding.ASCII.GetString(缓冲区,25,缓冲区(24))'文件名
如果存在My.Computer.FileSystem.files(“C:\Test”&FilePath),则
'Dim INFO 2作为新文件信息(文件夹路径和文件路径)
'Dim length2 As Long=信息2.长度
'如果数学天花板(长度2/10023)编号
'netStream.Flush()
'重拨缓冲区(10023)
'缓冲区(0)=数学上限(长度2/10023)
'netStream.Write(缓冲区,0,缓冲区.Length)
'Directory.CreateDirectory(Path.GetDirectoryName(FolderPath&FilePath))
'writer=newbinarywriter(System.IO.File.Open(FolderPath&FilePath,FileMode.Append))
'ProcessFile(FolderPath&FilePath、netStream、buffer、Math.天花板(length2/10024)、writer)
”“否则呢
'netStream.Flush()
'重拨缓冲区(10023)
'缓冲区(0)=0
'缓冲区(1)=1
'netStream.Write(缓冲区,0,缓冲区.Length)
"完"
其他的
'netStream.Flush()
'重拨缓冲区(10023)
'缓冲区(0)=0
'netStream.Write(缓冲区,0,缓冲区.Length)
Directory.CreateDirectory(Path.GetDirectoryName(“C:\Test”&FilePath))
'writer=newbinarywriter(System.IO.File.Open(FolderPath&FilePath,FileMode.Create))
'ProcessFile(FolderPath&FilePath、netStream、缓冲区、0、写入程序)
如果结束
作为新接收文件的Dim rec(文件路径,8001,编号)
结束时
端接头
公共类接收文件
Public Sub New(ByVal FilePath作为字符串,ByVal port作为整数,ByVal numberOfPackets作为整数)
'构造器
Dim ServerInstance作为新的TcpListener(端口)端口接收文件
ServerInstance.Start()
Dim ClientInstance作为TcpClient=ServerInstance.AcceptTcpClient
将netStreamInstance设置为NetworkStream=ClientInstance.GetStream
Dim缓冲区(10034)作为字节
Dim writer As BinaryWriter=New BinaryWriter(System.IO.File.Open(“C:\Test”&FilePath,FileMode.Create))
Dim计数为整数=0
Dim buff2(0)作为字节
做正确的事
暗字节读作ULong
尝试
bytesRead=netStreamInstance.Read(Buffer,0,Buffer.Length)
特例
终点
结束尝试
如果System.Text.Encoding.ASCII.GetString(缓冲区,0,11)“PenSendProc”,则
继续做
如果结束
Dim BufferData(UBound(Buffer)-11)作为字节
对于i=0到UBound(缓冲数据)
缓冲区数据(i)=缓冲区(i+11)
下一个
如果count=numberOfPackets-2,则
ReDim保留缓冲区数据(字节读取-1-11)
writer.Write(缓冲数据)
netStreamInstance.Write(buff2,0,buff2.Length)
退出Do
如果结束
writer.Write(缓冲数据)
netStreamInstance.Flush()
netStreamInstance.Write(buff2,0,buff2.Length)
计数+=1
环
writer.Close()
netStreamInstance.Write(buff2,0,buff2.Length)
ServerInstance.Stop()
ClientInstance.Close()
端接头
末级
末级
要发送的代码:

Imports System.Threading
Imports System.Net
Imports System.Net.Sockets
Imports System.IO

Public Class Form1

    Dim number As ULong
    Dim CancelTimerThread As Boolean
    Dim TimeItThread As Thread
    Dim file As System.IO.StreamWriter
    Dim threadTimeIt As Thread
    Dim NumberOfBytes As ULong
    Dim PortNumber As ULong = 8001


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Dim SendItClient As New TcpClient
        'SendItClient.Connect("10.0.20.61", 8000)
        'Dim nstm As NetworkStream = SendItClient.GetStream
        'Dim GetFolder As New FolderBrowserDialog
        'GetFolder.ShowDialog()
        'Dim path1 As String
        'path1 = GetFolder.SelectedPath

        'GetBytes(path1)
        'SendEachFileInDir(path1, path1, nstm)
        'SendItClient.Close()
    End Sub


    Private Sub GetBytes(ByVal path As String)


        For Each foundfile As String In My.Computer.FileSystem.GetFiles(path)
            Dim pstm As Stream = New FileStream(foundfile, FileMode.Open, FileAccess.Read)
            NumberOfBytes += pstm.Length
            pstm.Close()
        Next

        If My.Computer.FileSystem.GetDirectories(path).Count > 0 Then
            For Each Dir As String In My.Computer.FileSystem.GetDirectories(path)
                GetBytes(Dir)
            Next
        End If

    End Sub


    Private Sub SendEachFileInDir(ByVal path As String, ByVal path1 As String, ByVal nstm As NetworkStream)
        For Each foundfile As String In My.Computer.FileSystem.GetFiles(path)
            Dim fstm As Stream = New FileStream(foundfile, FileMode.Open, FileAccess.Read)
            Dim buffer(10024 - 1) As Byte
            Dim size As ULong  'no of packets
            size = Math.Ceiling(fstm.Length / 10024) + 1

            Dim ByteSize() As Byte = BitConverter.GetBytes(size)
            Dim ByteTotalNumber() As Byte = BitConverter.GetBytes(NumberOfBytes)
            Dim PortNumberBytes() As Byte = BitConverter.GetBytes(PortNumber)
            Dim filenamebytes() As Byte = System.Text.Encoding.ASCII.GetBytes(Mid(foundfile, path1.Length + 1))

            Dim SendBytes(UBound(ByteSize) + UBound(filenamebytes) + UBound(ByteTotalNumber) + UBound(PortNumberBytes) + 4) As Byte
            Dim count As Integer = 0

            For i = 0 To UBound(ByteSize)
                SendBytes(count) = ByteSize(i)
                count += 1
            Next

            For i = 0 To UBound(ByteTotalNumber)
                SendBytes(count) = ByteTotalNumber(i)
                count += 1
            Next

            For i = 0 To UBound(PortNumberBytes)
                SendBytes(count) = PortNumberBytes(i)
                count += 1
            Next

            SendBytes(count) = filenamebytes.Length
            count += 1

            For i = 0 To UBound(filenamebytes)
                SendBytes(count) = filenamebytes(i)
                count += 1
            Next

            nstm.Write(SendBytes, 0, SendBytes.Length)

            'ReDim buffer(1023)
            'nstm.Read(buffer, 0, buffer.Length)
            'Dim val As Integer = buffer(0)

            'If val = 0 And buffer(1) = 1 Then
            ' Continue For
            'End If
            'Dim buff2(0) As Byte


            ' count = 0
            ' nstm.Flush()
            ' Do While True
            ' ReDim buffer(10023)
            ' Dim bytesRead As Integer = fstm.Read(buffer, 0, buffer.Length)
            'If bytesRead = 0 Then
            'Exit Do
            'End If

            'If count >= val Then
            'If count = 10 Then
            '   End
            'End If
            'nstm.Write(buffer, 0, bytesRead)
            'nstm.Read(buffer, 0, buffer.Length)
            'nstm.Read(buff2, 0, buff2.Length)
            'End If
            'count += 1
            'Loop
            'nstm.Read(buff2, 0, buff2.Length)


            Dim SendIt As New SendFile(foundfile, 8001, fstm)
        Next

        If My.Computer.FileSystem.GetDirectories(path).Count > 0 Then
            For Each Dir As String In My.Computer.FileSystem.GetDirectories(path)
                SendEachFileInDir(Dir, path1, nstm)
            Next
        End If


    End Sub

    Public Class SendFile
        Public Sub New(ByVal foundfile As String, ByVal port As Integer, ByVal fstm As FileStream)
            Dim count As Integer = 0
            Dim SendFileClient As New TcpClient
            Dim netsStream As NetworkStream
            Dim Buffer(10023) As Byte
            Dim buff2(0) As Byte
            Dim buffstart() As Byte = System.Text.Encoding.ASCII.GetBytes("PenSendProc")
            'Dim fstm As Stream = New FileStream(foundfile, FileMode.Open, FileAccess.Read)

            SendFileClient.Connect("10.0.20.1", port)
            netsStream = SendFileClient.GetStream

            Do While True
                ReDim Buffer(10023)
                Dim bytesRead As Integer = fstm.Read(Buffer, 0, Buffer.Length)
                Dim CountIt As Integer = 0

                If bytesRead = 0 Then
                    Exit Do
                End If


                Dim BufferSend(UBound(buffstart) + UBound(Buffer) + 1) As Byte

                For i = 0 To UBound(buffstart)
                    BufferSend(CountIt) = buffstart(i)
                    CountIt += 1
                Next

                For i = 0 To UBound(Buffer)
                    BufferSend(CountIt) = Buffer(i)
                    CountIt += 1
                Next

                If bytesRead < 10024 Then
                    'MessageBox.Show("jj")
                End If

                netsStream.Write(BufferSend, 0, 11 + bytesRead)
                netsStream.Read(buff2, 0, buff2.Length)
                netsStream.Flush()
                count += 1
            Loop
            netsStream.Read(buff2, 0, buff2.Length)

        End Sub
    End Class


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim SendItClient As New TcpClient
        SendItClient.Connect("10.0.20.1", 8000)
        Dim nstm As NetworkStream = SendItClient.GetStream
        Dim GetFolder As New FolderBrowserDialog
        GetFolder.ShowDialog()
        Dim path1 As String
        path1 = GetFolder.SelectedPath

        GetBytes(path1)
        SendEachFileInDir(path1, path1, nstm)
        SendItClient.Close()
    End Sub
End Class
导入系统线程
导入系统.Net
导入System.Net.Sockets
导入System.IO
公开课表格1
暗编号为ULong
Dim CancelTimer读取为布尔值
Dim TimeItThread作为线程
Dim文件作为System.IO.StreamWriter
暗淡的线程将其设置为线程
Dim NumberOfBytes作为ULong
尺寸端口号为ULong=8001
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
'Dim SendItClient作为新的TcpClient
“SendItClient.Connect”(“10.0.20.61”,8000)
'Dim nstm As NetworkStream=SendItClient.GetStream
'Dim GetFolder As New FolderBrowser对话框
'GetFolder.ShowDialog()
'将路径1设置为字符串
'路径1=GetFolder.SelectedPath
'GetBytes(路径1)
'发送每个文件索引器(路径1、路径1、nstm)
'SendItClient.Close()
端接头
私有子GetBytes(ByVal路径为字符串)
对于My.Computer.FileSystem.GetFiles(路径)中的每个foundfile作为字符串
Dim pstm As Stream=新文件流