★☆★☆★☆★☆TCP通讯问题,特别急!!!!!!!

zhouziqiang 2008-07-09 02:27:38
通讯问题:
TCP1: TIdTCPClient;

客户端要向服务端发送一个数据包 ,发送时的格式如下:

序号 指令类型 长度 备注
1 协议ID 4字节 物品信息(11301)
2 数据长度 4字节 整个数据包的长度
3 数据 N字节 全部存放的数据

第二项为数据的长度,其后面实际数据的长度。
第三项为要发送的实际数据的内容。




实际数据包的具体格式如下:
名称 长度 含义
DeviceNo 8B 物品编号
DeviceLogo 16B 物品品牌
DeviceColor 8B 物品颜色
DeviceNum 6B 物品数量
Time 8B 上货时间(包括毫秒数)
PicLen 4B 图片长度(全景)
Pic PicLenB 图片内容(PicLen)(二进制流)
PicLen 4B 图片长度(特写)
Pic PicLenB 图片内容(PicLen)B(二进制流)

请问具体该如何实现?急!!!!!谢谢!!!望高手救我!!!!!!


...全文
321 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzmhero 2008-08-06
  • 打赏
  • 举报
回复
LZ太不厚道了。
gzmhero 2008-07-10
  • 打赏
  • 举报
回复

ReadBuffer(buf,8);读出头。
取得长度
iLen:=PInteger(@buf[4])^;
再取后面的缓冲区
ReadBuffer(@buf[8],iLen);
wlm_8888 2008-07-10
  • 打赏
  • 举报
回复
to gzmhero

你那个发送出去后怎么取出来
dd_zhouqian 2008-07-10
  • 打赏
  • 举报
回复
看了上面的,人人都会有分的
ttlyfast 2008-07-10
  • 打赏
  • 举报
回复
正在写server 与你的差不多 ^-^
gzmhero 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhouziqiang 的回复:]
我主要不太会组
[/Quote]

3楼的代码不行么?按照你的变量类型改下就好用啊。
BatiTan 2008-07-10
  • 打赏
  • 举报
回复
按照定义的数据结构将对应的字节放入ByteBuffer中
lkldiy 2008-07-10
  • 打赏
  • 举报
回复
定义数据结构啊,完了定义结构变量,初始化后memcpy到你的发送缓冲区Buf中
gxj760998 2008-07-10
  • 打赏
  • 举报
回复
将你的包组成BYTE数组,按逻辑存放,然后按逻辑取就是了!
标准的协议都是这样的啊。
zhouziqiang 2008-07-09
  • 打赏
  • 举报
回复
我主要不太会组
gzmhero 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhouziqiang 的回复:]
除了物品数量是integer ,其他变量都是string
[/Quote]

早问你的时候不说清楚,白写了很多行代码。

按照我上面的写法把字段一个一个写进去然后发送。
字符型这样处理:
CopyMemory(@buf[len],pchar(DeviceLogo),16);
kampan 2008-07-09
  • 打赏
  • 举报
回复
将你那堆数据按照格式组成一个字符串或者一个记录 然后发送出去就行;
一段代码供参考:
procedure TForm1.Button2Click(Sender: TObject);
begin
self.ListBox1.Items.Add('DATA ' + edit3.Text);
with IdTCPClient1 do
begin
try
WriteLn('DATA ' + edit3.Text);
self.ListBox1.Items.Add(ReadLn())
except
self.ListBox1.Items.Add('发送数据失败!');
IdTCPClient1.Disconnect();
self.ListBox1.Items.Add('同主机 ' + edit1.Text + ' 的连接已断开!');
self.Button1.Enabled := True;
self.Button2.Enabled := False;
self.Button3.Enabled := False;
end;//end try
end;//end with
end;
zhouziqiang 2008-07-09
  • 打赏
  • 举报
回复
能详细点吗 具体怎么实现 我不太会!!!谢谢
喝口水 2008-07-09
  • 打赏
  • 举报
回复
接收可以用tcp1.readbuffer(mypack,sizeof(mypack));
喝口水 2008-07-09
  • 打赏
  • 举报
回复
手边没有D,所以手写一下

名称 长度 含义
DeviceNo 8B 物品编号
DeviceLogo 16B 物品品牌
DeviceColor 8B 物品颜色
DeviceNum 6B 物品数量
Time 8B 上货时间(包括毫秒数)
PicLen 4B 图片长度(全景)
Pic PicLenB 图片内容(PicLen)(二进制流)
PicLen 4B 图片长度(特写)
Pic PicLenB 图片内容(PicLen)B(二进制流)

假设你把上面定义成一个记录TMyPack,那么
myPack:TMyPack;
TCP1.WriteBuffer(myPack,sizeof(mypack));
喝口水 2008-07-09
  • 打赏
  • 举报
回复
aaa
zhouziqiang 2008-07-09
  • 打赏
  • 举报
回复
除了物品数量是integer ,其他变量都是string
gzmhero 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhouziqiang 的回复:]
16B就是16byte
[/Quote]

我当然知道16B是16Byte,但是不知道你的变量是什么类型,Double?结构体?字符?不同的类型需要不同的方法写入。
gzmhero 2008-07-09
  • 打赏
  • 举报
回复
给你写点参考代码,你的信息提供得太少,看懂了下面的代码,自然你就会自己实现去了。


const
G_MAXBUFLEN = 1024*100;//设置最大的缓冲区

...

var
len:integer;

pic:TMemoryStream;
buf:array[0..G_MAXBUFLEN] of byte;
begin
.........
len:=0;
PInteger(@buf[len])^:=11301;
inc(len,8);
PInteger(@buf[len])^:=DeviceNo;
inc(len,4);
CopyMemory(@buf[len],@DeviceLogo,16);//DeviceLogo是啥类型?结构体?
inc(len,16);
PInteger(@buf[len])^:=DeviceColor;
inc(len,4);
CopyMemory(@buf[len],@DeviceNum,6);//DeviceNum是啥类型?6个字节?
inc(len,6);
CopyMemory(@buf[len],@Time,8);
inc(len,8);
CopyMemory(@buf[len],@PicLen,4);
inc(len,4);
pic.ReadBuffer(@buf[len],PicLen);
inc(len,PicLen);
CopyMemory(@buf[len],@PicLen,4);
pic.ReadBuffer(@buf[len],PicLen);
inc(len,PicLen);
PInteger(@buf[4])^:=len;

IdTCPClient1.WriteBuffer(buf,len);
end;

zhouziqiang 2008-07-09
  • 打赏
  • 举报
回复
16B就是16byte
加载更多回复(1)

1,593

社区成员

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

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