代码之家  ›  专栏  ›  技术社区  ›  Omair Iqbal

无法将文本(字符串)从ttcpserver发送到ttcpclientserver

  •  3
  • Omair Iqbal  · 技术社区  · 16 年前

    我有两个表单,一个用于服务器,另一个用于客户端。 在服务器窗体上删除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 label 2按钮,将clients remote host属性设置为127.0.0.1,将remote port设置为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;
    

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Robert Love    16 年前

    ttcpserver不存储连接列表,这会使广播式消息变得困难。

    我建议切换到tidtcpserver和tidtcpclient。TidtcpServer组件有一个上下文属性,您可以通过循环将消息广播给客户机,类似于您想要做的事情。

    以下链接指向使用tidtcpserver和tidtcpclient的示例:

        2
  •  1
  •   Remy Lebeau    14 年前

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

    如果 TTcpServer.BlockMode 属性设置为 bmThreadBlocking (默认),或者 ttcpserver.blockmode(阻止模式) 设置为任何其他值,您正在手动调用重载的无参数 TTcpServer.Accept() 方法,则只有从内部 TTcpServer.OnAccept 事件。在这些情况下,当该事件处理程序退出时,服务器将断开客户机的连接,因此服务器要与客户机进行的任何工作都必须在该事件内部完成。

    如果这不适合你的需要,那么你必须设置 ttcpserver.blockmode(阻止模式) 属性 bmBlocking bmNonBlocking 然后手动调用重载 ttcpserver.accept()接受 返回 TCustomIpClient 对象。后 ttcpserver.onaccept(接收) 事件已被触发和退出,您将获得该对象的所有权,并对其生存期拥有完全控制权,然后可以随时访问它。

    推荐文章