TTcpServer远程连接服务

时间:2013-08-14 18:01:18

标签: delphi networking delphi-7

我需要使用TTcpServer赢得XP服务。

应用程序是由“File-> New-> Other-> ServiceApplication”创建的

TTcpServer.localport:= 33000

使用exename.exe / install

注册的服务器

一切看起来都不错,即使netstat -a显示端口33000 - LISTENING

但我无法从本机外部访问该端口。只在当地。

当我用相同的参数制作标准应用程序时 - 一切正常。 TTcpServer config

EDIT1 TTcpServe.OnAccept =

procedure TFlexorXL.tcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
  var str: string;
begin
 if ClientSocket.Connect then
 begin
    str := ClientSocket.Receiveln;

  ClientSocket.Sendln('test');
               //ClientSocket.Disconnect;
  end;
end;

1 个答案:

答案 0 :(得分:2)

TCP / IP在服务中运行得很好(我一直使用它),所以你可能只是滥用TTcpServer组件(这是可能的,因为它是一个可怕的书面组件)。

如果TTcpServer.LocalHost属性为空,则套接字将绑定到所有可用的本地IPv4地址,否则它将仅绑定到您指定的特定IPv4地址(netstat将显示服务器的实际IP实际上是绑定的)。这是您必须连接客户端的IP。在0.0.0.0的情况下,您可以连接到属于服务器计算机的任何IP。

话虽如此,为了真正接受客户,您必须:

  1. TTcpServer.BlockMode属性设置为bmThreadBlocking。然后,服务器将使用内部工作线程来接受连接,并且每个客户端将在其自己的工作线程中运行。但是,您必须在TTcpServer.OnAccept事件内执行所有与客户端相关的逻辑,因为在该事件处理程序退出后,客户端将立即断开连接。

  2. 对于BlockMode的任何其他值,您必须自己调用TTcpServer.Accept(),例如在计时器或线程中。如果调用没有参数的Accept()的重载版本,则必须在TTcpServer.OnAccept事件内执行所有与客户端相关的逻辑,因为客户端将在该事件处理程序退出后立即断开连接。如果您调用返回Accept()对象的TCustomIpClient的其他重载版本,则可以控制该对象的生命周期,并可以根据需要使用它。

  3. 话虽如此,如果你正在做所有这些,但仍然遇到问题,那么你需要提供有关实际TTcpServer设置的更多信息,显示一些实际的TTcpServer代码等。目前看来,你没有提供足够的细节来诊断你的问题。