(菜鸟)socket怎么发送自定义的数据类型? ( 积分: 50 )

呵呵o

Unregistered / Unconfirmed
GUEST, unregistred user!
我最近正在写一个socket的通信程序,我使用的是普通的clientsocket和serversocket两个控件,我查阅了一些资料,对于组聊形式已经能实现了,但是还不能实现点对点聊天,也就是象QQ那样的私聊。。。。
我自定义了一个数据类型:
type
Tdata=record//程序消息传送数据类型
fromhost:string;//来自哪台客户机
tohost:string;//客户机的聊天对象
xiaoxi:string;//传送的内容
mingling:integer;//传送的类型
end;
我现在还不知道怎么在服务器端发送这个数据类型,在客户端能收到。。。。。
我用serverSocket1.Socket.Connections.SendBuf(Pdata,sizeof(Tdata));老是要报错,是不是我SendBuf函数用错了,还是自定义的数据类型不是用SendBuf发的,请高手指点一下。。。。。。

顺便说一下:我传送图片用sendstream,数据类型也应该可以发送,但是在客户端怎么接收??我对tstream一点也不懂。。。。。。。。。。。
 
我最近正在写一个socket的通信程序,我使用的是普通的clientsocket和serversocket两个控件,我查阅了一些资料,对于组聊形式已经能实现了,但是还不能实现点对点聊天,也就是象QQ那样的私聊。。。。
我自定义了一个数据类型:
type
Tdata=record//程序消息传送数据类型
fromhost:string;//来自哪台客户机
tohost:string;//客户机的聊天对象
xiaoxi:string;//传送的内容
mingling:integer;//传送的类型
end;
我现在还不知道怎么在服务器端发送这个数据类型,在客户端能收到。。。。。
我用serverSocket1.Socket.Connections.SendBuf(Pdata,sizeof(Tdata));老是要报错,是不是我SendBuf函数用错了,还是自定义的数据类型不是用SendBuf发的,请高手指点一下。。。。。。

顺便说一下:我传送图片用sendstream,数据类型也应该可以发送,但是在客户端怎么接收??我对tstream一点也不懂。。。。。。。。。。。
 
发送用流式,接收也用流式就行了
 
能不能说得在详细点,我对流什么也不懂
得到了具体流怎么向delphi的数据类型转换??????
 
怎么没人来帮我的呢
分少的话还能加的啊。。。。。。。。。。。
我想学东西。。。。。。。
 
不能用string!
socket通讯通常都是传字符数组的,也就是对于每一个字段,定义
type
TData = record // 程序消息传送数据类型
FromHost: array[1..32] of Char; // 来自哪台客户机
ToHost:array [1..32] of Char; //客户机的聊天对象
Msg: array[1..1024] of Char; //传送的内容
Cmd: Integer; //传送的类型
end;
因为string是变长,而且不是基本类型,无法在socket里直接传送的
上面长度我只是示例,具体得按你的需求定
 
To 呵呵o:
1、你自定义的 Tdata 中含有 string 类型,它实际上是一种指针(Size = 4),你发送了几个指针过去,客户端肯定要出错了。
2、楼上老兄的思路和方法都是可行的,只是限制了 Msg 的大小。其实你只需把 SendBuf(Pdata,sizeof(Tdata)) 换成 SendBuf(PData, Length(PData^.FromHost) + Length(PData^.ToHost) + Length(PData^.Msg) + SizeOf(PData^.Cmd) + 3) 即可。不过这里的PData 必须是一个具体的指针变量,它指向已有的 TData 类型的变量。
 
TMyData = ^TData;
TData = record
var MyData: TMyData ;
 
socket发送的都是字节流,与数据结构无关。

注意根据返回值修正下次发送的数据。
 
感谢各位的帮助
to islet8:那传送到客户端,是不是还要把传过去的字符在组合起来?这样不是很麻烦
to vvyang:你的那种方法我也试过,但是我没有你最后的SizeOf(PData^.Cmd) + 3),我想请问最后的3是什么东西??我当时也程序的时候,没有加3,我也看到在字符串的内容比较小的时候,Tdata的大小是不变的,所以我才这么做的。我本来以为buffer不就是内存中的一个指针嘛,我以为能直接就这么传的,只要在机器上把地址给它就可以了。

是不是在使用socket的时候,尽量要是用windows支持的数据类型??
 
不要组合的,因为传过来的数据是定长,所以直接内存拷贝到一个该记录的对象里去,就可以直接通过字段名来访问各值了
 
感谢islet8你的热心帮助!!
 
多人接受答案了。
 
顶部