Delphi 客户';s udpserver don';t反应
我的服务器表单具有仅接受4个tcp连接用户的stringgride 为此,我将udpclient放在服务器中,将udpserver放在客户端中 在服务器形式的tcp onconnect事件中:Delphi 客户';s udpserver don';t反应,delphi,delphi-7,indy,Delphi,Delphi 7,Indy,我的服务器表单具有仅接受4个tcp连接用户的stringgride 为此,我将udpclient放在服务器中,将udpserver放在客户端中 在服务器形式的tcp onconnect事件中: //Server Side has udp client procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin //when fifth user want to connect to tcpserve
//Server Side has udp client
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
//when fifth user want to connect to tcpserver
//server first ensure at list one of the 4 connected user in grid has disconnected
//by send udp broadcast to 4 user
//but in this timeout None of these users do not respond , Although still connected
IdUDPClient1.Broadcast('IP', 1718);
For i:=1 To 4 Do
begin
IPList.Add(IdUDPClient1.ReceiveString(200););
end;
end;
//Client Side has udp server
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
//
ip:=GetipAddress();
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, ip[1], Length(ip));
end;
我在客户端运行ethereal来检查网络,看到udp消息从服务器发送到客户端,但客户端没有响应
请帮助我我的代码有什么问题您的
TIdUDPServer.OnUDPRead
事件处理程序没有正确的签名,甚至没有关闭TIdUDPServer
根本不使用TIdPeerThread
,只有TIdTCPServer
使用。您需要做更多类似的事情:
服务器:
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
//when fifth user want to connect to tcpserver
//server first ensure at list one of the 4 connected user in grid has disconnected
//by send udp broadcast to 4 user
//but in this timeout None of these users do not respond , Although still connected
IPList.Clear;
IdUDPServer1.Broadcast('IP', 1718);
Sleep(1000);
end;
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
S: String;
begin
if AData.Size > 0 then
begin
SetLength(S, AData.Size);
AData.ReadBuffer(S[1], AData.Size);
IPList.Add(S);
end;
end;
客户:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
S: String;
begin
if AData.Size > 0 then
begin
SetLength(S, AData.Size);
AData.ReadBuffer(S[1], AData.Size);
end;
if S = 'IP' then
begin
S := ABinding.IP;
if (S = '') or (S = '0.0.0.0') then
S := GStack.LocalAddress;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, S[1], Length(S));
end;
end;
您没有显示接收UDP广播的客户端代码。但你为什么要使用UDP呢?TIdTCPServer有一个MaxConnections属性,您应该使用TCP keepalives/heartbeats来检测死掉的TCP客户端。我第一次使用TCP,但不起作用,我在onconnect事件tcpserver中使用tcpclient,但不起作用。它的编辑@RemyleBeau只是说“它不起作用”,这与您遇到的实际问题无关。如果您希望他人帮助您,您需要提供实际的详细信息。我使用tcp而不是udp,但出现错误,连接正常关闭,客户端不响应为什么您的服务器端有IdUDPServer1UDPRead,我的服务器端有udp客户端,客户端有UDPServer。我的意思是显示两边都在使用
TIdUDPServer
。对TIdUDPClient
的引用是一个打字错误。我已经修好了。至于为什么服务器端使用TIdUDPServer
,是因为客户端响应是异步的,TIdUDPClient
不适合处理。因为UDP是无连接的,TIdUDPServer
可以与另一个TIdUDPServer
进行对话,这与TCP不同。我使用这个,但不回答,当服务器广播IdUDPServer1UDPRead客户端事件没有执行时,为什么?只有“IP”字保存在IPList中,为什么?广播可能不会通过网络进行,或者客户端不在同一子网上。使用Wireshark进行验证。服务器端TIdUDPServer
正在接收自己的广播。我仍然建议您放弃UDP,改用TCP keepalives。