所以我正在尝试制作一个可以调用客户端程序的服务器程序。如果我自己从命令行调用它们,但服务器客户端工作正常,但是当服务器调用它时连接被拒绝。为什么这不起作用?
这是服务器代码:
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()
这是客户端代码:
import socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/SocketTest")
s.send('Hello, world \n')
s.send('its a mighty fine day')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
答案 0 :(得分:2)
os.system
将运行您完成的命令,并在调用listen
之前执行此操作。因此,客户端将在收听之前尝试连接到服务器。只有在客户端退出后,服务器才会继续通过该行代码实际开始侦听和接受连接。
您可能想要做的是在调用listen
之后,但在调用accept
之前(当您开始阻止时),使用subprocess.Popen
生成子进程< em>并且不要等待它。
答案 1 :(得分:0)
我认为错误是您在致电compute.py
之前正在致电listen
。
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()
输出:
Received 'Hello, world \nits a mighty fine day'