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=新文件流