VB.NET里怎样用socket发结构体

flyer79 2005-01-21 04:54:51
我的程序里有两个结构体,结构体A中的AD4包含了结构体B的内容

Public Structure A
Dim AD1() As Byte
Dim AD2() As Byte
Dim AD3() As Byte
Dim AD4() As B
End Structure

Public Structure B
Dim BD1() As Byte
Dim BD2() As Byte
Dim BD3() As Byte
......
End Structure

这是我尝试把这个结构体发出去的代码:
Dim Buffer() As Byte
Dim Temp As A
Dim A_set As New A
......
A_set.AD1="123".ToCharArray
.....
Temp = A_set
Buffer = System.Text.Encoding.Default.GetBytes(Temp.ToString)
Client.GetStream().Write(Buffer, 0, Buffer.Length)

编译是通过的,但buffer里却是些莫名其妙的数字。可能是我把那里搞错了。求高手解决,怎么样才能将这个结构体发出去?
...全文
349 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tttt0945 2005-02-21
  • 打赏
  • 举报
回复
mark
tl_pear 2005-02-17
  • 打赏
  • 举报
回复
顶一下!
学习!
SeeSunSet 2005-02-17
  • 打赏
  • 举报
回复
序列化和反序列化,此时不用何时用?
srxumin 2005-02-16
  • 打赏
  • 举报
回复
结构体不能直接发送,要先把结构体序列化,再转成二进制发送。
到接收方再把它反序列化成对象,需要注明的是:在.NET使用序列化对象或结构体时要用到DLL共享类库,否则双方会因为结构体版本不同而造成调试通不过
下面是我自己聊天程序的一部分,可给你做一些参考:

这是DLL中定义的一个可以序列化的类,尖括号里的关键字请参考MSDN
<Serializable()> Public Class CChat
Public SendUser As String '发送人
Public Content As String '内容
Public Face As String '表情
Public Style As Font '字体
End Class

下面这两个函数我用了内存流,应该还有更简单的方法,但是我现在没找到
'二进制数组转化成命令
Private Function BinToCmd(ByVal Bin() As Byte) As CCommand
Dim Formatter As New BinaryFormatter '定义序列化对象
Dim StreamTemp As New MemoryStream(Bin) '数组->内存流
Dim Cmd As CCommand = CType(Formatter.Deserialize(StreamTemp), CCommand) '内存流->对象
StreamTemp.Close()
Return Cmd
End Function

'命令转化成二进制数组
Private Function CmdToBin(ByVal Cmd As CCommand) As Byte()
Dim StreamTemp As New MemoryStream '定义流对象
Dim Formatter As New BinaryFormatter '定义序列化对象
Formatter.Serialize(StreamTemp, Cmd) '对象->内存流
StreamTemp.Close()
Return StreamTemp.GetBuffer() '内存流->数组
End Function

下面是发送方(客户端)向接收方(服务器端)发送的用户退出信号,command是个命令对象,也作为对象传输用。
'用户退出处理
Private Sub CFrmClient_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
'向服务器发送“删除用户”命令
Dim Command As New CCommand
Command.Cls = "删除用户"

Dim DelUser As New CDelUser
DelUser.UserID = User.ID
Command.Obj = DelUser
SndBuf = CCommand.CmdToBin(Command)
Skt.BeginSend(SndBuf, 0, SndBuf.Length, SocketFlags.None, New AsyncCallback(AddressOf SendCallBack), Skt)
End Sub

注意几点事项:
一、直接传送对象和结构的好处就是不需要使用编码转换
二、你在使用过程中一定要把互相传送的结构放在DLL文件中定义成可序列化,否则系统无法完成结构传送
三、结构传送会使网络通讯量增加,请把bytes型数组定义得尽量大些,以免缓冲区溢出
四、传送结构可传送任意可序列化结构,至于是否会连结构里的方法一起传送,而造成网络负载增加,我还没做此试验,所以你尽量把要传送的结构定义成里面只有属性的。

有很多不足之处还请高手指点。
TonyTonyQ 2005-01-28
  • 打赏
  • 举报
回复
Byte類型,表示的就是0~255,在.NET中以數字形式表現。只要你收到時能正常解碼就不會有問題了,否則你就要考慮修改你的轉換算法了。

建議你使用二進制串行化來做,這樣編碼和解碼都比較方便。不過只要你能實現編碼和解碼,任何算法都是可行的。
flyer79 2005-01-24
  • 打赏
  • 举报
回复
又沉底了,顶一下
flyer79 2005-01-24
  • 打赏
  • 举报
回复
up
coldco519 2005-01-24
  • 打赏
  • 举报
回复
在vs.net2003水晶报表的注册码希望大家能给一个,急用
非常谢谢
flyer79 2005-01-24
  • 打赏
  • 举报
回复
接收端是已经固定的程序,现在我的这个程序只能去迎合它。但我一直有些搞不懂的是怎么样可以让发过去的东西是这样的结构:AD1:0000/0;AD2:89999/0;AD3:HEJDUE/0;.....
simon8181 2005-01-24
  • 打赏
  • 举报
回复
你接受的不对吗?Buffer 里面是Bytes,当然是看不明白了。接受的对就可以。
机器人 2005-01-21
  • 打赏
  • 举报
回复
需要用序列化成二进制流,通过socket传过去,然后接收端再反序列化回去。
mulintaomulintao 2005-01-21
  • 打赏
  • 举报
回复
Temp.ToString()有这个函数吗?你自己看一下temp.ToString()的结果是什么?
flyer79 2005-01-21
  • 打赏
  • 举报
回复
没人理我吗?顶一下

16,553

社区成员

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

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