Indy10发送与接收问题(记录) Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiNetwork/html/delphi_20061214163900127.html
我使用TIDTcpClient及TIdTcpServer,
使用ReadLn及WriteLn正常.
但是我想发送记录类型,如何做呢?我的实现如下,但没有成功:
------------------------------------------------------------
type
TUser=record
UserName,UserID:String;
IP:String;
Port:Integer;
Msg:String;
Arr:Array[1..9] of shortString;
flag:Boolean;
Cmd:String;
end;
------------------------------------------------------------
实现如下:
------------------------------------------------------------
1.使用TidBytes类型:
客户:
procedure TForm1.Button3Click(Sender: TObject);
var
User:TUser;
sby:TidBytes;
begin
with user do
begin
UserName:='Wyatt';
UserID:='7895421';
Ip:='192.168.1.188';
Port:=9999;
Msg:=Edit3.Text;
cmd:='Quit';
end;
sBy:=RawTOBytes(user,sizeof(user));
ic1.IOHandler.Write(sBy);
end;
服务器:
procedure TFrmServer.is1Execute(AContext: TIdContext);
var
user:TUser;
buf:TidBytes;
begin
Acontext.Connection.IOHandler.ReadBytes(buf,sizeof(user));
BytesToRaw(buf,user,sizeof(user));
with user,memo1.Lines do
begin
Add(userName);
add(userID);
add(ip);
add(inttostr(port));
end;
end;
----------------------------------------------------------------
2.使用TStream方法:
客户:
procedure TForm1.Button3Click(Sender: TObject);
var
User:TUser;
Mon:TMemoryStream;
begin
with user do
begin
UserName:='Wyatt';
UserID:='85171659';
Ip:='192.168.1.188';
Port:=9999;
Msg:=Edit3.Text;
cmd:='Quit';
end;
Mon:=TMemoryStream.Create;
try
Mon.WriteBuffer(user,sizeof(user));
ic1.IOHandler.Write(Mon);
finally
Mon.Free;
end;
end;
服务器:
procedure TFrmServer.is1Execute(AContext: TIdContext);
var
user:TUser;
Mon:TMemoryStream;
begin
Mon:=TMemoryStream.Create;
try
AContext.Connection.IOHandler.ReadStream(Mon);
Mon.ReadBuffer(user,Sizeof(user));
with user,memo1.Lines do
begin
Add(userName);
add(userID);
add(ip);
add(inttostr(port));
end;
finally
Mon.Free;
end;
end;
以上都不能实现,请高手帮忙解决一下.
以上是在delphi2006
注意一定要Indy10,因为和Indy9不同
其中要注意Use IdContext,IdGlobal这两个单元
一个想法
先接收成byte array 然后使用 copyMemory转换
type
TUser=record
UserName,UserID:String;
IP:String;
Port:Integer;
Msg:String;
Arr:Array[1..9] of shortString;
flag:Boolean;
Cmd:String;
end;
这样定义是有问题的,里面的String会导致包大小计算不对
楼上分析准确,就是这个原因
在Record内不要使用String类型,就算要用,也要用String[254]这种或Array of Char
呵,谢谢
我改动一个,
type
TUser=record
UserName,UserID:String[20];
IP:String[16];
Port:Integer;
Msg:String[100];
Arr:Array[1..9] of String[20];
flag:Boolean;
Cmd:String[20];
end;
------------------------
使用RawtoBytes及BytesToRaw可以。
为何使用Stream收不到呢?
另,如果要传送像文件类似的东西,如何定义呢?
自己定义应用协议,数据格式,传输规范
例如FTP,HTTP等都是TCP的应用协议
再求,为何使用Stream收不到呢?