使用python套接字拒绝连接

2024-09-27 21:29:53 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图制作一个服务器程序来调用客户端程序。如果我自己从命令行调用它们,服务器客户机工作正常,但是当服务器调用它时,连接被拒绝。为什么这样不行?在

这是服务器代码:

import socket,os

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
    os.remove("/tmp/SocketTest")
except OSError:
    pass
s.bind("/tmp/SocketTest")
os.system("python compute.py")#compute is the client
#execfile('compute.py')
s.listen(1)
conn, addr = s.accept()
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

这是客户代码:

^{pr2}$

Tags: 代码命令行pyimport服务器data客户机os
2条回答

os.system将运行您给它完成的命令,您在调用listen之前执行此操作。因此,客户端将在侦听之前尝试连接到服务器。只有客户机退出后,服务器才会越过这行代码,真正开始监听和接受连接。在

您可能要做的是在调用listen之后,但在调用accept(即开始阻塞时),使用subprocess.Popen生成子进程,而不是等待它。在

我认为错误是您在调用listen之前调用了compute.py。在

os.system将阻止您的服务器,直到对python compute.py的调用完成。在

尝试使用subprocess.Popen以非阻塞方式在服务器上并行生成对compute.py的调用。调用subprocess.Popen将在新进程中启动python compute.py,并将继续执行下一行conn, addr = s.accept()

#!/usr/bin/env python

import socket
import os
import subprocess

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
    os.remove("/tmp/SocketTest")
except OSError:
    pass
s.bind("/tmp/SocketTest")
s.listen(1)
sp = subprocess.Popen(["/usr/bin/env", "python", "compute.py"])
conn, addr = s.accept()
while 1:
    data = conn.recv(1024)
    if not data:
        break
    conn.send(data)
conn.close()

结果是:

^{pr2}$

相关问题 更多 >

    热门问题