2014-12-07 5 views
0

Так что я пытаюсь создать серверную программу, которая вызывается клиентской программой. Клиент сервера работает нормально, если я вызываю их сам из командной строки, но при отказе на соединение отказывается. Почему это не работает?Connection отказался от сокетов 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() 

Это код клиента:

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

Ваш клиент не может подключиться, пока вы не вызовете слушать или принимать на сокете - но вы вызываете свою клиентскую программу перед этими строками в своей серверной программе. Ваш сервер также будет сидеть и ждать, пока ваш клиент закончит работу, прежде чем продолжить работу над вызовом os.system - возможно, не то, что вы хотите. – Ben

ответ

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' 
2

os.system будет выполнить команду, вы даете его к завершению, и вы делаете это, прежде чем звонить listen. Таким образом, клиент попытается подключиться к серверу до его прослушивания. Только после выхода клиента сервер перейдет по этой строке кода, чтобы фактически начать прослушивание и прием соединений.

То, что вы, вероятно, хотите сделать это после вызова listen, но перед вызовом accept (который, когда вы начинаете блокирование), используйте subprocess.Popen нереститься подпроцесс и не ждать на нем.

Смежные вопросы