gpt4 book ai didi

delphi - Indy TCP 客户端/服务器,客户端充当服务器

转载 作者:行者123 更新时间:2023-12-03 14:34:45 25 4
gpt4 key购买 nike

Indy的TIdTCPClientTIdTCPServer在以下场景中如何使用:

Client  ---------- initate connection -----------> Server
...
Client <---------------command------------------- Server
Client ----------------response-----------------> Server
...
Client <---------------command------------------- Server
Client ----------------response-----------------> Server

客户端启动连接,但充当“服务器”(等待命令并执行它们)。

在这种情况下,TIdTCPServerOnExecute 方法不能很好地工作(至少我没有让它很好地工作)。我怎样才能做到这一点?

我希望问题足够清楚。

最佳答案

没有什么可以阻止您使用 Indy 的 TIdTCPServer 组件执行此操作。

TIdTCPServer 仅建立连接。您需要实现其余部分。所以实际发送和接收的顺序可以是任何你想要的。

将此代码放入 TIdTCPServer 组件的 OnExecute 事件中:

var
sName: String;
begin
// Send command to client immediately after connection
AContext.Connection.Socket.WriteLn('What is your name?');
// Receive response from client
sName := AContext.Connection.Socket.ReadLn;
// Send a response to the client
AContext.Connection.Socket.WriteLn('Hello, ' + sName + '.');
AContext.Connection.Socket.WriteLn('Would you like to play a game?');
// We're done with our session
AContext.Connection.Disconnect;
end;

以下是如何非常简单地设置 TIdTCPServer:

IdTCPServer1.Bindings.Clear;
IdTCPServer1.Bindings.Add.SetBinding('127.0.0.1', 8080);
IdTCPServer1.Active := True;

这告诉服务器仅在端口 8080 上监听环回地址。这可以防止计算机外部的任何人连接到它。

然后,要连接您的客户端,您可以转到 Windows 命令提示符并键入以下内容:

telnet 127.0.0.1 8080

这是输出:

What is your name?

Marcus

Hello, Marcus.

Would you like to play a game?

Connection to host lost.

没有远程登录?以下是如何 install telnet client on Vista and 7 .

或者使用 TIdTCP 客户端,您可以执行以下操作:

var
sPrompt: String;
sResponse: String;
begin
// Set port to connect to
IdTCPClient1.Port := 8080;
// Set host to connect to
IdTCPClient1.Host := '127.0.0.1';
// Now actually connect
IdTCPClient1.Connect;
// Read the prompt text from the server
sPrompt := IdTCPClient1.Socket.ReadLn;
// Show it to the user and ask the user to respond
sResponse := InputBox('Prompt', sPrompt, '');
// Send user's response back to server
IdTCPClient1.Socket.WriteLn(sResponse);
// Show the user the server's final message
ShowMessage(IdTCPClient1.Socket.AllData);
end;

这里需要注意的重要一点是 ReadLn 语句会等待,直到有数据为止。这就是这一切背后的魔力。

关于delphi - Indy TCP 客户端/服务器,客户端充当服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8415551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com