我想在delphi中建立TIdTCPServer
和TIdTCPClient
之间的通信,这就是我的程序:
1.服务器端:
procedure TMainForm.IdTCPServer1Execute(AContext: TIdContext);
var
clientReq, clientName : String;
begin
clientReq := AContext.Connection.IOHandler.ReadLn(); // client sends request
clientName := extractClientName(clientReq);
AContext.Connection.IOHandler.WriteLn('Hello ' + clientName);
end;
2.客户方:
procedure TMainForm.btnTestClientClick(Sender: TObject);
var
testTCP : TIdTCPClient;
clientReq, serverResponse : String;
begin
testTCP := TIdTCPClient.Create;
try
testTCP.Host := wantedHost;
testTCP.Port := wantedPort;
testTCP.Connect;
clientReq := 'Hello, my Name is user1.';
testTCP.IOHandler.WriteLn(clientReq);
try
serverResponse := testTCP.IOHandler.ReadLn();
except on e : Exception do begin
ShowMessage('Error reading response =' + e.Message);
end;
end;
finally
FreeAndNil(testTCP);
end;
end;
当我尝试使用OnExecute
方法从服务器TCPClient.IOHandler.ReadLn
事件接收响应时,我连接到服务器但我的应用程序冻结了。任何人都可以帮我修改我的代码或向我展示我正在尝试做的工作示例(使用Indy的TIdTCPClient
和TIdTCPServer
)吗?
答案 0 :(得分:1)
您显示的代码没有任何问题,因此问题必须出在您未显示的代码中。我看待它的方式有两种可能性:
如果您没有将wantedHost
和/或wantedPort
设置为正确的值,则实际上您不会连接到预期的服务器。
如果extractClientName()
内部卡住但未退出,则服务器不会发送任何响应。可能发生的一种方法是,如果您在同一进程中运行客户端和服务器,并且extractClientName()
与主线程同步,但主线程在客户端上被阻塞等待并且无法处理同步,因此出现死锁发生。