我有2个表单,1表示服务器另一个表示客户端。 在服务器表单上删除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事件hadler:
procedure TForm2.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
var DataLen: Integer);
begin
Label1.caption := TcpClient1.Receiveln();
end;
我的客户端程序标题应该更改为“消息”(在我连接并单击服务器表单上的按钮之后),但它确实有效。我这样做是错误的吗?如果是,那该怎么办?我正在尝试从服务器向客户端发送文本消息(是反向连接!)
答案 0 :(得分:2)
TTcpServer不存储连接连接列表,这使得广播样式消息很难。
我建议切换到TidTcpServer和TidTcpClient。 TidTcpServer组件有一个Context属性,您可以循环以向客户端广播消息,类似于您似乎想要做的事情。
这里有一些链接到使用TidTcpServer和TIdTcpClient的例子:
答案 1 :(得分:1)
您的服务器代码不起作用,因为TTcpServer.SendLn()
不会将数据发送到连接套接字的客户端端点。这就是为什么客户端永远不会看到数据 - 它被发送到了无数。
如果TTcpServer.BlockMode
属性设置为bmThreadBlocking
(默认情况下是这样),或者TTcpServer.BlockMode
设置为其他任何属性,并且您手动调用无参数加载{{ 1}}方法,然后您可以访问客户端点的唯一位置是TTcpServer.Accept()
事件内部。在这些条件下,当该事件处理程序退出时,服务器将断开客户端的连接,因此服务器要对客户端执行的任何工作都必须在该事件内完成。
如果这不符合您的需求,则必须将TTcpServer.OnAccept
属性设置为TTcpServer.BlockMode
或bmBlocking
,然后手动调用重载的bmNonBlocking
方法返回TTcpServer.Accept()
个对象。触发并退出TCustomIpClient
事件后,您将获得该对象的所有权并完全控制其生命周期,然后随时随地访问它。