VB.NET的Socket传输出现乱码,C#没问题。不是中文。

fishboyok 2010-09-18 11:26:36
同样的代码,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
...全文
285 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CloneCenter 2010-09-20
  • 打赏
  • 举报
回复
那个怪字符,可能是不可见的非正常显示字符。
获得所有字节流内容之后,再全部一起转为 String。
fishboyok 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]
你可以直接看看字节流,那个错误字符是什么,然后就可以分析错误了。
[/Quote]
我添加监控的时候,还是显示的是“□”
wood87654321 2010-09-19
  • 打赏
  • 举报
回复
怀疑接收时TransferFiles.ReceiveVarData(client)获得的缓冲区长度不准确导致,建议对System.Text.Encoding.Unicode.GetBytes和System.Text.Encoding.Unicode.GetString使用带精确位置控制的那种重载
fishboyok 2010-09-19
  • 打赏
  • 举报
回复
具体怎么操作呢?
fishboyok 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyazhe 的回复:]
已经是vb.net写的了。怎么能叫同样的代码。说明你还是有些地方不同。代码太多。没仔细看。最近大脑严重懒惰,看到大段代码就Sleep了。我所能想到的解决方法已经都写在上面了。
[/Quote]
呵呵。除了因语法不同而需要变动的地方外,其余一样。
兔子-顾问 2010-09-18
  • 打赏
  • 举报
回复
已经是vb.net写的了。怎么能叫同样的代码。说明你还是有些地方不同。代码太多。没仔细看。最近大脑严重懒惰,看到大段代码就Sleep了。我所能想到的解决方法已经都写在上面了。
fishboyok 2010-09-18
  • 打赏
  • 举报
回复
同样的代码:
C#的Sever发client收正常。
VB.NET的Sever发C#的client收正常。
C#的Sever发vb.net的client收不正常。
兔子-顾问 2010-09-18
  • 打赏
  • 举报
回复
如果时间来不及细看问题。你可以把c#写的代码编译成dll,供vb.net调用。
兔子-顾问 2010-09-18
  • 打赏
  • 举报
回复
你可以直接看看字节流,那个错误字符是什么,然后就可以分析错误了。

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧