3

我有两种形式,一种用于服务器,另一种用于客户端。在服务器表单上删除 ttcpserver 并将其 localhost 属性设置为 127.0.0.1 并将 localport 属性设置为 55555 并将 Active 属性设置为 true 后,我编写了一个 button1(sendtextbutton) onclick 事件处理程序:

procedure TForm2.Button1Click(Sender: TObject);
begin
      TcpServer1.Sendln('message');
end;

然后在客户端表单上,我删除了 1 个 ttcpclient 1 标签 2 个按钮,将客户端远程主机属性设置为 127.0.0.1 并将远程端口设置为 55555,为 connectbutton(button1) 编写了一个事件处理程序:

procedure TForm2.Button1Click(Sender: TObject);
begin
try
TcpClient1.Active := true;
except
showmessage('error');

end;
end;

为 ttcpclient 编写了一个 onconnect 事件:

procedure TForm2.TcpClient1Connect(Sender: TObject);
begin
    Label1.Caption := 'connected!';
end;

最后是 ttcpclient 的 onrecieve 事件处理程序:

procedure TForm2.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin
    Label1.caption := TcpClient1.Receiveln();
end;

我的客户端程序标题应该更改为“消息”(在我连接并单击服务器表单上的按钮后),但它没有。我做错了吗?如果是,那该怎么做?我正在尝试从服务器向客户端发送短信(是的反向连接!)

4

2 回答 2

2

TTcpServer 不存储使广播式消息变得困难的已连接连接列表。

我建议切换到 TidTcpServer 和 TidTcpClient。TidTcpServer 组件有一个 Context 属性,您可以循环使用该属性向客户端广播消息,类似于您似乎想要做的事情。

这里有一些使用 TidTcpServer 和 TIdTcpClient 示例的链接:

于 2010-07-06T16:53:29.017 回答
1

您的服务器代码不起作用,因为TTcpServer.SendLn()没有将数据发送到已连接套接字的客户端端点。这就是为什么客户端永远看不到数据的原因——它被发送到了边缘。

如果TTcpServer.BlockMode属性设置为bmThreadBlocking(默认情况下),或者如果TTcpServer.BlockMode设置为其他任何值并且您手动调用无参数重载TTcpServer.Accept()方法,那么您可以访问客户端端点的唯一位置是从TTcpServer.OnAccept事件内部。在这些情况下,当该事件处理程序退出时,服务器将断开客户端的连接,因此服务器想要对客户端执行的任何工作都必须在该事件内部完成。

If that does not suit your needs, then you will have to set the TTcpServer.BlockMode property to either bmBlocking or bmNonBlocking and then manually call the overloaded TTcpServer.Accept() method that returns a TCustomIpClient object. After the TTcpServer.OnAccept event has been triggered and exited, you will gain ownership of that object and have full control over its lifetime and can then access it whenever and however you want.

于 2012-07-13T21:15:25.287 回答