如何在同一端口上传输不同的数据类型?

阿武 2010-12-15 10:58:33
大家好,我用indy控件传输数据,因为有时候需要发送不同的数据类型,如double数组,bool数组,或自定义的结构体。
长度内容不一样,我用了不同的端口来分辨不同的数据类型。感觉这样做好像不太正规,应该可以直接从文件头中识别
不同的数据。但具体怎么做搞不懂,网上查不到相关的信息。有没有朋友能指点下如何实现的?谢谢。
...全文
203 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZyxIp 2010-12-18
  • 打赏
  • 举报
回复
你是没有办法通过接收到的数据长度来判断的,因为有可能一次发送而多次收到。
ZyxIp 2010-12-16
  • 打赏
  • 举报
回复
数据包的头
THead=packed Record
Head1:Byte;
Head2:Byte;
ID:Byte;
Len:Word;
end;
个人信息
TMyInfo=packed Record
Name:Array [0..9]of Char;
Time:TDateTime;
Age:Word;
end;

比如现在我要发送个人信息从A到B

procedure Send(Sockek:TCustomWinSocket);
var
Head:THead
MyInfo:TMyInfo;
CRC:Byte;//校验
Buf:Array of Byte;
begin
Head.Head1:=$AA;
Head.Head2:=$FF; 从A到B的数据包都是以 $AA $FF 开头
Head.ID:=10;//发送个人信息的命令为10,每个发送命令用不同的编号
Head.Len:=SizeOf(Head)+SizeOf(MyInfo)+1; //整个数据包的长度,加1是最后一位是校验码
MyInfo.Name:='ABC';//用户名
MyInfo.Time:=Now; //生日
MyInfo.Age:=10;

SetLength(Buf,Head.Len);
CopyMemory(Buf,@Head,SizeOf(Head));
CopyMemory(Buf,Pointer(Integer(@Head)+SizeOf(Head)),SizeOf(MyInfo));
Buf[Head.Len-1]:=$99;//这里应该是校验
Sockek.SendBuf(Buf,Head.Len);
SetLenght(Buf,0);
end;

收到后根据 Head.Head1,Head.Head2知道这是一个数据的开始,然后根据Head.Len找到数据的结尾,然后根据
校验来知道数据传输是否正确。
Head.ID知道传递是个人信息。 然后在取出数据。

zhaodog 2010-12-16
  • 打赏
  • 举报
回复
在传输的数据中用一个位置,表示你传输的数据时什么类型,就像Variant 类型一样
keeley20 2010-12-16
  • 打赏
  • 举报
回复
将内容写入流 发送
接收流,写到自定义的结构体。
bdmh 2010-12-16
  • 打赏
  • 举报
回复
一个端口足够,你发送的其实都是流数据,跟你什么类型无关,把包组的规矩点,包体含有识别信息,接收到后,先解码出头信息,然后根据不同的头信息去处理包体
阿武 2010-12-16
  • 打赏
  • 举报
回复
数据量比较小,所以直接用的udp协议。而且是一个交换机内传输,就不用加校验了。
想来应该没问题。:)
阿武 2010-12-16
  • 打赏
  • 举报
回复
想了个简单的方法,跟楼上的想法一样。因为数据类型只有四种,2种结构体,1个布尔数组,一个双精度数组。
对应的长度分别是1,7,10,2047,所以我直接在接收时根据接收的数据流长度判断用哪种类型就可以了。
谢谢大家。
haitao 2010-12-15
  • 打赏
  • 举报
回复
编码为base64或ini或xml,再传输

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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