procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
M: TMemoryStream;
str: string;
MyStringList: TStringList;
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create('');
M:=tMemoryStream.Create;
M.LoadFromStream(Adata);
MyStringList := TStringList.Create;
M.position:=0;
MyStringList.LoadFromStream(M);
str:=Trim(MyStringList.Text);
showmessage(str);
showmessage(inttostr(abinding.peerport));
showmessage(abinding.PeerIP);
// ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, '000000000',100);
try
DataStringStream.CopyFrom(AData, AData.Size);
s := 'Replied from ' + IdUDPServer1.LocalName + ' to "' + DataStringStream.DataString + '"';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
finally
DataStringStream.Free;
end;
end;服务器端有固定ip,客户端传给服务器端的都行,怎样能做到让服务器段接收到一条消息后返回给当前客户端一条信息,客户端怎么接收.
ABinding: TIdSocketHandle);
var
M: TMemoryStream;
str: string;
MyStringList: TStringList;
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create('');
M:=tMemoryStream.Create;
M.LoadFromStream(Adata);
MyStringList := TStringList.Create;
M.position:=0;
MyStringList.LoadFromStream(M);
str:=Trim(MyStringList.Text);
showmessage(str);
showmessage(inttostr(abinding.peerport));
showmessage(abinding.PeerIP);
// ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, '000000000',100);
try
DataStringStream.CopyFrom(AData, AData.Size);
s := 'Replied from ' + IdUDPServer1.LocalName + ' to "' + DataStringStream.DataString + '"';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
finally
DataStringStream.Free;
end;
end;服务器端有固定ip,客户端传给服务器端的都行,怎样能做到让服务器段接收到一条消息后返回给当前客户端一条信息,客户端怎么接收.
>>让服务器段接收到一条消息后返回给当前客户端一条信息,客户端怎么接收.
能否設置成廣播數據包呢??收到的就回復!UPD, 應該沒有Server, Client之分啊, 但indy不知為何多了這樣一對!
注意UdpServer有一个端口须要Bind,这个端口可以指定,而UdpClient的端口是自动指定的,所以udpclient若要等待返回数据,要以阻塞方式.
事实上两端可以都用IdUdpServer来收发数据
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
IdUdpServer1.Send('127.0.0.1',1000,'Hello,World');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
IdUdpServer2.Send('127.0.0.1',999,'Hello,World');
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Buffer : array[0..255] of char;
begin
Memo1.Lines.Add('Received: '+ABinding.PeerIP+' Port: '+IntToStr(ABinding.PeerPort));
AData.Read(Buffer,255);
Memo1.Lines.Add(Buffer);
end;procedure TForm1.IdUDPServer2UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Buffer : array[0..255] of char;
begin
Memo2.Lines.Add('Received: '+ABinding.PeerIP+' Port: '+IntToStr(ABinding.PeerPort));
AData.Read(Buffer,255);
Memo2.Lines.Add(Buffer);
end;
我这边得不到固定的ip地址,再说大家都是在同一个局域网中,我改怎么设置
ABinding.SendTo(ABinding.PeerIP,ABinding.PeerPort,Buffer,255);
那么就会一直收发下去
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Buffer : array[0..255] of char;
begin
Memo1.Lines.Add('Received: '+ABinding.PeerIP+' Port: '+IntToStr(ABinding.PeerPort));
AData.Read(Buffer,255);
Memo1.Lines.Add(Buffer);
ABinding.Send(Buffer,StrLen(Buffer),0);
ABinding.SendTo(ABinding.PeerIP,ABinding.PeerPort,Buffer,255);//这里可以发回给客户端
end;
var
buffer : array[0..255] of char;
ret : integer;
begin
IdUdpclient1.Send('Hello,World');
ret := IdUdpClient1.ReceiveBuffer(buffer,255,3000);// 等待接收数据.
if ret > 0 then
showmessage(buffer);
end;不好意思,上面的写错了.把这行去掉:
ABinding.Send(Buffer,StrLen(Buffer),0);
do while xx>0
begin
rect := self.UDPClient.ReceiveString();
if rect = 'Error' then exit;
....
end;