我正在为客户端和服务器使用tidudpserver。下面是给出的服务器和客户端代码。
unit udp_server;
procedure TForm4.serverUDPRead(AThread: TIdUDPListenerThread;
AData: array of Byte; ABinding: TIdSocketHandle);
var
buffer:tbytes;
buffer2:tbytes;
i:integer;
ex_port:word;
i_ip,ex_ip:string;
t: string;
begin
ex_ip:=abinding.PeerIP; //public_ip
ex_port:=abinding.PeerPort; //public_port
//byte to string
setlength(i_ip,length(adata) div 2);
// extract private ip from array of byte
move(Adata[0],i_ip[1],length(adata));
// client profile {object of tclient }
user:=tclient.create(ex_ip,ex_port,i_ip,0,'');
//copying public and private endpoints to tclient object
setlength(buffer,sizeof(user));
move(user,buffer[0],sizeof(user)); // copying object to byte array
server.Sendbuffer(abinding.PeerIP,abinding.PeerPort,buffer);
// send client info to all connected clients(is this correct way of sending buffer(byte array)?)
end;
这是给定的客户端代码。我无法读取服务器在onudpread
过程中发送的数据。如何将字节数组(包含字符串和单词类型)转换为可读文本?
unit udp_client;
procedure TForm4.server2UDPRead(AThread: TIdUDPListenerThread;
AData: array of Byte; ABinding: TIdSocketHandle);
var
dest:string;
user2:tclient;// i had a tclient class in a separate file
buffer:tbytes;
begin
setlength(dest,length(adata));
move(Adata[0],dest[1],length(adata)); // problem is over here ,is this correct?
end;
从客户端发送的私人IP
ip:=getipaddress; //call private ip function taken from (http://delphi.about.com/od/networking/l/aa103100a.htm)
setlength(i_ip,length(ip)*2);
move(ip[1],i_ip[0],length(i_ip));
server2.Sendbuffer('host',port,i_ip);
我想做udp打孔,因为客户需要将他们的信息(公共/私人IP /端口)发送到服务器,然后服务器将交换客户信息,然后他们应该能够聊天。我很困惑,因为adata数组是收到所有数据会将ip和短信相互混合吗?目前我收到垃圾值,就像中文一样。: - /
答案 0 :(得分:3)
此代码存在一些问题。
在服务器代码中,将收到的数据复制到Move()
时,您将错误的大小值传递给String
。您在致电SizeOf(Char)=2
时会考虑SetLength()
,但在致电Move()
时则不会。如果收到的数据开头是UTF-16(您没有显示收到的数据实际上看起来像什么),那么将Sizeof(Char)
考虑在内是唯一正确的做法。
更大的问题是您正在尝试将对象发送到客户端,而这将无法工作。您必须将对象的各个数据成员序列化为平面可传输格式,然后再发送该数据。例如,IdGlobal
单元有许多功能可用于执行数据< - >字节转换(ToBytes()
重载,BytesTo...()
重载,CopyTId...()
重载等)。因此,您可以分配一个足够大的TIdBytes
来保存所有对象的数据,用数据填充它,然后发送它。收到后,再将其拆分为单个值。你如何实际完成所有这些取决于你首先尝试发送的数据类型(你也没有显示)。
如果你想要更具体的例子,你需要解释你实际上想要来回交换的数据类型。
答案 1 :(得分:0)
尝试使用StringOf函数。它适用于TBytes类型。