Indy UDP 发送和响应简单字符串
Indy UDP sending and responding simple strings
我正在使用 Delphi 10.0 西雅图。
我想向 UDP 服务器发送请求,然后读取服务器响应,这是一个简单的字符串:
Client side:send('12345')
server side(onread event or whatever):if received string = ('12345') then
send ('jhon|zack|randy')
else disconnect;
响应字符串的长度是可变的。
服务器 运行 处于开放连接良好的网络(专用 vps)。
客户端不一样,在路由器和安全网络后面(不是转发)。
到目前为止,我只能发送来自客户端的请求:
(uc=idUDPclient)
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
if uc.Connected =False then
Uc.Connect;
uc.Send('12345');
uc.ReceiveTimeout := 2000;
s:=uc.ReceiveString() ;
ShowMessage(s);
uc.Disconnect
end;
服务器端(us=idUDPserver)
procedure TForm1.usUDPRead(AThread:TIdUDPListenerThread;const AData: TIdBytes;ABinding: TIdSocketHandle);
begin
ShowMessage(us.ReceiveString());
if us.ReceiveString() = '12345' then
begin
ShowMessage(us.ReceiveString());
//respond with a string to the client immediately (behind a routers) how ?
end;
不知道TCP好不好用,怎么用
Android会参与
您没有正确使用 TIdUDPServer.OnUDPRead
事件。您需要摆脱对 ReceiveString()
的调用,它们不属于那里。请改用 AData
参数,它包含客户端请求的原始字节。 TIdUDPServer
在触发事件处理程序之前已经读取了客户端的数据。
如果您需要 string
中的字节,您可以使用 Indy 的 BytesToString()
函数,或 IIdTextEncoding.GetString()
方法。
要将响应发送回客户端,请使用 ABinding
参数。
试试这个:
procedure TForm1.usUDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
var
s: string;
begin
s := BytesToString(AData);
//ShowMessage(s);
if s = '12345' then begin
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, 'jhon|zack|randy', ABinding.IPVersion);
end;
end;
我正在使用 Delphi 10.0 西雅图。
我想向 UDP 服务器发送请求,然后读取服务器响应,这是一个简单的字符串:
Client side:send('12345')
server side(onread event or whatever):if received string = ('12345') then
send ('jhon|zack|randy')
else disconnect;
响应字符串的长度是可变的。
服务器 运行 处于开放连接良好的网络(专用 vps)。 客户端不一样,在路由器和安全网络后面(不是转发)。
到目前为止,我只能发送来自客户端的请求:
(uc=idUDPclient)
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
if uc.Connected =False then
Uc.Connect;
uc.Send('12345');
uc.ReceiveTimeout := 2000;
s:=uc.ReceiveString() ;
ShowMessage(s);
uc.Disconnect
end;
服务器端(us=idUDPserver)
procedure TForm1.usUDPRead(AThread:TIdUDPListenerThread;const AData: TIdBytes;ABinding: TIdSocketHandle);
begin
ShowMessage(us.ReceiveString());
if us.ReceiveString() = '12345' then
begin
ShowMessage(us.ReceiveString());
//respond with a string to the client immediately (behind a routers) how ?
end;
不知道TCP好不好用,怎么用
Android会参与
您没有正确使用 TIdUDPServer.OnUDPRead
事件。您需要摆脱对 ReceiveString()
的调用,它们不属于那里。请改用 AData
参数,它包含客户端请求的原始字节。 TIdUDPServer
在触发事件处理程序之前已经读取了客户端的数据。
如果您需要 string
中的字节,您可以使用 Indy 的 BytesToString()
函数,或 IIdTextEncoding.GetString()
方法。
要将响应发送回客户端,请使用 ABinding
参数。
试试这个:
procedure TForm1.usUDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
var
s: string;
begin
s := BytesToString(AData);
//ShowMessage(s);
if s = '12345' then begin
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, 'jhon|zack|randy', ABinding.IPVersion);
end;
end;