【发布时间】:2021-09-01 02:37:22
【问题描述】:
我正在用 Python 在 Windows 10 上编写一个小应用程序。 它应该监听 TCP 套接字连接并接收一些数据。应用程序不需要任何响应。应用程序必须作为 Windows 服务运行。 在调试模式下运行时,它可以完美运行。它接收数据并处理它。 当作为服务运行时(使用 pyinstaller 和 pywin32 包),不会收到任何数据,也不会发生任何事情。
def sockThread(port: int, interface: str):
global sock
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((interface, port))
except socket.error as e:
logging.error('could not open socket connection with' + interface + ":" + str(port))
logging.error('error: ' + str(e))
return
logging.info("socket timeout: " + str(sock.gettimeout()))
#run:
while stop==False:
logging.info("socketthread starting, listening on:" + interface + ":" + str(port))
try:
sock.listen(1)
c, addr = sock.accept()
#logging.info("socketthread connection accepted")
except socket.error as e:
logging.error('error while listening to socket:' + str(e))
else:
data = c.recv(2048)
#logging.info("data received: " + str(data))
processStarter.startSubProcess(data)
logging.error("socket thread leaving")
使用 Raspberry Pi 命令行测试代码:
netcat -w1 192.168.178.27 60000 <testfile.txt
Windows 服务和应用程序的配置有什么不同吗?
【问题讨论】:
-
记录了什么错误? NB 您只需要
listen()一次,在bind()之后。不在循环内。第二次和后续的listen()调用将失败,正如您的日志记录必须显示的那样。 -
我需要循环监听,因为客户端不止一次发送数据。我不想每次都重新打开套接字。没有错误记录为服务,也没有连接作为服务。在使用单独的 Main 方法处于调试模式时,按预期工作
-
不,您确实不需要在循环中
listen(),因为这不是您使用套接字 API 的方式。您的错误记录应该已经向您展示了这一点。你检查过吗?您需要在循环中接受。 -
好的,那么监听方法的调用应该移到循环前面吗?没有错误:INFO:root:socket timeout:无 INFO:root:socketthread 正在启动,正在侦听:192.168.178.27:60000 编辑:好的,我发现了一个可能的错误根源。让我修复配置文件
-
我:“你只需要
listen()一次,在bind()之后。不在循环内。”。你:“我需要循环听。”我:“不,你不需要在循环中listen()。”你:“好的,所以调用listen方法应该移到循环前面吗?”请。
标签: python windows sockets service netcat