我需要使用TTcpServer赢得XP服务。
应用程序是由“File-> New-> Other-> ServiceApplication”创建的
TTcpServer.localport:= 33000
使用exename.exe / install
注册的服务器一切看起来都不错,即使netstat -a
显示端口33000 - LISTENING
但我无法从本机外部访问该端口。只在当地。
当我用相同的参数制作标准应用程序时 - 一切正常。
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;
答案 0 :(得分:2)
TCP / IP在服务中运行得很好(我一直使用它),所以你可能只是滥用TTcpServer
组件(这是可能的,因为它是一个可怕的书面组件)。
如果TTcpServer.LocalHost
属性为空,则套接字将绑定到所有可用的本地IPv4地址,否则它将仅绑定到您指定的特定IPv4地址(netstat将显示服务器的实际IP实际上是绑定的)。这是您必须连接客户端的IP。在0.0.0.0
的情况下,您可以连接到属于服务器计算机的任何IP。
话虽如此,为了真正接受客户,您必须:
将TTcpServer.BlockMode
属性设置为bmThreadBlocking
。然后,服务器将使用内部工作线程来接受连接,并且每个客户端将在其自己的工作线程中运行。但是,您必须在TTcpServer.OnAccept
事件内执行所有与客户端相关的逻辑,因为在该事件处理程序退出后,客户端将立即断开连接。
对于BlockMode
的任何其他值,您必须自己调用TTcpServer.Accept()
,例如在计时器或线程中。如果调用没有参数的Accept()
的重载版本,则必须在TTcpServer.OnAccept
事件内执行所有与客户端相关的逻辑,因为客户端将在该事件处理程序退出后立即断开连接。如果您调用返回Accept()
对象的TCustomIpClient
的其他重载版本,则可以控制该对象的生命周期,并可以根据需要使用它。
话虽如此,如果你正在做所有这些,但仍然遇到问题,那么你需要提供有关实际TTcpServer
设置的更多信息,显示一些实际的TTcpServer
代码等。目前看来,你没有提供足够的细节来诊断你的问题。