VB.NET的Socket传输出现乱码,C#没问题。不是中文。
同样的代码,VB.NET收到的字符就有一个“□”尾巴,C#就没问题。
发送代码:
Private Sub StartSend()
'创建一个文件对象
Dim EzoneFile As New FileInfo(Me.TextBox1.Text)
'打开文件流
Dim EzoneStream As FileStream = EzoneFile.OpenRead()
'包的大小
Dim PacketSize As Integer = Integer.Parse(Me.TextBox6.Text)
'包的数量
Dim PacketCount As Integer = Int(EzoneStream.Length / PacketSize)
SetText(PacketCount)
'最后一个包的大小
Dim LastDataPacket As Integer = EzoneStream.Length - (PacketSize * PacketCount)
'指向远程服务端节点
Dim ipep As New IPEndPoint(IPAddress.Parse(TextBox7.Text.Trim()), Integer.Parse(Me.TextBox4.Text))
'创建套接字
Dim client As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
'连接到发送端
Try
client.Connect(ipep)
Catch ex As Exception
MsgBox(ex.Message)
Exit Sub
End Try
'获得客户端节点对象
Dim clientep As IPEndPoint = DirectCast(client.RemoteEndPoint, IPEndPoint)
'发送[文件名]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name))
'发送[包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()))
'发送[包的总数量]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()))
'发送[最后一个包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()))
'数据包
Dim data As Byte() = New Byte(PacketSize) {}
'开始循环发送数据包
Dim i As Integer = 0
While i < PacketCount
'从文件流读取数据并填充数据包
EzoneStream.Read(data, 0, data.Length)
'发送数据包
TransferFiles.SendVarData(client, data)
System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
End While
'如果还有多余的数据包,则应该发送完毕!
If LastDataPacket <> 0 Then
data = New Byte(LastDataPacket) {}
EzoneStream.Read(data, 0, data.Length)
TransferFiles.SendVarData(client, data)
End If
'关闭套接字
client.Close()
'关闭文件流
EzoneStream.Close()
MessageBox.Show("文件传输完毕!")
End Sub
接收代码:
Public Sub StartReceive()
Dim client As Socket = ClientSocket
'获得客户端节点对象
Dim clientep As IPEndPoint = DirectCast(client.RemoteEndPoint, IPEndPoint)
'获得[文件名]
Dim SendFileName As String = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client))
ListBox1.Items.Add("文件名:" + SendFileName) '这里就开始接收到“□”了,在文件名后面带一个“□”
'获得[包的大小]
Dim bagSize As String = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client))
'获得[包的总数量]
Dim bagCount As Integer = Integer.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client))) '字符带一个“□”尾巴,没法转化为整型数据,程序员出错。换过Encoding,不太理想
Me.ProgressBar1.Maximum = bagCount
ListBox1.Items.Add("包的总量:" + bagCount)
'获得[最后一个包的大小]
Dim bagLast As String = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client))
'创建一个新文件
Dim MyFileStream As New FileStream(SendFileName, FileMode.Create, FileAccess.Write)
'已发送包的个数
Dim SendedCount As Integer = 0
While True
Dim data As Byte() = TransferFiles.ReceiveVarData(client)
If data.Length = 0 Then
Exit While
Else
System.Math.Max(System.Threading.Interlocked.Increment(SendedCount), SendedCount - 1)
'将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length)
'显示已发送包的个数
Me.ProgressBar1.PerformStep()
End If
End While
'关闭文件流
ListBox1.Items.Add("已经接收文件。")
Me.ProgressBar1.Maximum = Me.ProgressBar1.Maximum
MyFileStream.Close()
'关闭套接字
client.Close()
End Sub