连接被python套接字拒绝

时间:2014-12-07 23:15:54

标签: python linux sockets

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

这是服务器代码:

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)

2 个答案:

答案 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'