这两天在做一个项目,就是通过idtcpClient循环向IdTCPserver发送消息,但是测试发现,IdTCPClient循环发送消息后,IDTCPServer只能收到第一个包,从第二个开始就收不到了。不知道什么原因。请高人帮忙给看看。
协议定义 PCommandData2 = ^TCommandData2;
TCommandData2 = record
FileDesc: array[0..1023] of char;
end;
PCommandHead = ^TCommandHead;
TCommandHead = record
Size : Integer;
end;Client发送消息部分:
procedure TForm1.Button3Click(Sender: TObject);
const
AMsgStyle : array[0..5] of string = ('FileName','FileNo','ClientType','GUID','UserId','Type');
var
i: Integer;
Str: String; Head: PCommandHead;
Data: PCommandData2;
begin
if IdTCPClient.Connected then
begin
//传输附属信息
for i := 0 to High(AMsgStyle) do
begin
case i of
0: Str := '巧虎.avi'; //fileName
1: Str := '1'; //fileNo
2: Str := 'PC'; //clientType
3: Str := '{D6B43501-8DE2-46E0-B24E-C7C800C71B00}'; //itemID
4: Str := '8746407'; //userId
5: Str := '10'; //type
end;
FillChar(FSendBuffer,SizeOf(FSendBuffer),0);
Head := PCommandHead(@FSendBuffer);
Head.Size := htonl(Strlen(pchar(str)));
Data := PCommandData2(@FSendBuffer[SizeOf(TCommandHead)]); StrLCopy(Data^.FileDesc, PChar(Str), SizeOf(Data^.FileDesc));
idTCPClient.WriteBuffer(FSendBuffer,SIZEOF(FSendBuffer),True);
end;
end;
end;
Server接受消息部分:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
Head: PCommandHead;
Data2: PCommandData2;
Size: Integer;
begin
AThread.Connection.ReadBuffer(FRecvBuffer,SizeOf(TCommandHead) + SizeOf(TCommandData2));
Head := PCommandHead(@FRecvBuffer);
Size := ntohl(Head^.Size);
Data2 := PCommandData2(@FRecvBuffer[SizeOf(TCommandHead)]); Memo.Lines.Add(Data2^.FileDesc);
end;期盼高人能帮我解惑。
协议定义 PCommandData2 = ^TCommandData2;
TCommandData2 = record
FileDesc: array[0..1023] of char;
end;
PCommandHead = ^TCommandHead;
TCommandHead = record
Size : Integer;
end;Client发送消息部分:
procedure TForm1.Button3Click(Sender: TObject);
const
AMsgStyle : array[0..5] of string = ('FileName','FileNo','ClientType','GUID','UserId','Type');
var
i: Integer;
Str: String; Head: PCommandHead;
Data: PCommandData2;
begin
if IdTCPClient.Connected then
begin
//传输附属信息
for i := 0 to High(AMsgStyle) do
begin
case i of
0: Str := '巧虎.avi'; //fileName
1: Str := '1'; //fileNo
2: Str := 'PC'; //clientType
3: Str := '{D6B43501-8DE2-46E0-B24E-C7C800C71B00}'; //itemID
4: Str := '8746407'; //userId
5: Str := '10'; //type
end;
FillChar(FSendBuffer,SizeOf(FSendBuffer),0);
Head := PCommandHead(@FSendBuffer);
Head.Size := htonl(Strlen(pchar(str)));
Data := PCommandData2(@FSendBuffer[SizeOf(TCommandHead)]); StrLCopy(Data^.FileDesc, PChar(Str), SizeOf(Data^.FileDesc));
idTCPClient.WriteBuffer(FSendBuffer,SIZEOF(FSendBuffer),True);
end;
end;
end;
Server接受消息部分:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
Head: PCommandHead;
Data2: PCommandData2;
Size: Integer;
begin
AThread.Connection.ReadBuffer(FRecvBuffer,SizeOf(TCommandHead) + SizeOf(TCommandData2));
Head := PCommandHead(@FRecvBuffer);
Size := ntohl(Head^.Size);
Data2 := PCommandData2(@FRecvBuffer[SizeOf(TCommandHead)]); Memo.Lines.Add(Data2^.FileDesc);
end;期盼高人能帮我解惑。
1 第一你的代码很多部分貌似都不全的说
2 第二带有string类型的结构体赋值不要用fillchar
3 idtcp接受数据也是有缓冲的,当缓冲占满的时候会出现各种问题,所以使用WriteBuffer发送数据时记得flush
4 另外这里有个例子可供参考
http://topic.csdn.net/u/20090116/21/a442c14d-3995-48ee-a00e-0aac3b597af7.html
发送缓冲区: FSendBuffer: array[0..1023] of byte
接受缓冲区:FRecvBuffer: array[0..1023] of Byte很简单的协议:包头(内容长度,4Byte) + 内容 这种格式,但是很奇怪,循环第一次,Server 可以接收到,以后全部为空。
2.fillchar是数组
3.Flush以后也没有效果
谢谢大家