Это мой код:отправки данных через две программы в питона
socketcheck.py
import time
import subprocess
subprocess.Popen(["python", "server.py"])
for i in range(10):
time.sleep(2)
print i
def print_from_server(data):
print data
server.py
import socket
from socketcheck import print_from_server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost',3005))
client_connected = 1
while 1:
s.listen(1)
conn, addr = s.accept()
data = conn.recv(1024)
if data:
client_connected = 0
else: break
if client_connected == 0:
print 'data received'
print_from_server(data)
client_connected = 1
conn.sendall(data)
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',3005))
s.sendall('Hello, world')
data = s.recv(1024)
#s.close()
print 'Received', repr(data)
Что Я пытаюсь сделать здесь, запустите socketcheck.py
, который запускает server.py
в фоновом режиме и прослушивает соединение с клиентом. Так что любые данные, которые отправляет клиент, я хочу передать его на socketcheck.py
. Действительно ли это? Если да, то как мне это достичь?
Теперь, когда я пытаюсь запустить socketcheck.py
, цикл for работает бесконечно.
Спасибо :)
EDIT:
Это первоначально я попытался в одной программе, но до тех пор, пока клиент не подключается, остальная часть программы не выполняет (блокирование), с setblocking(0)
в поток программы не останавливается, но когда клиент подключается к серверу, он не печатает (ничего не делать). Серверный код выглядел примерно так:
импорт гнездо из socketcheck импорт print_from_server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost',3005))
s.setblocking(0)
while 1:
try:
s.listen(1)
conn, addr = s.accept()
conn.setblocking(0)
data = conn.recv(1024)
if not data: break
print 'data received'
conn.sendall(data)
except:
print 'non blocking'
print 'the lengthy program continues from here'
Но здесь я пытаюсь передать аргументы функции, определенной в socketcheck.py, так почему новый подпроцесс создается каждый раз? Не следует ли просто вызвать функцию print_from_server? – Anusha
Странно, если вы используете инструкцию print для файла вместо popen, она действительно выполняется только один раз. – tfv
Я понял это сейчас: вы открываете новую server.py программу в socketcheck.py. Если этот новый сервер.py вызывает print_from_server (данные), это первый раз, когда он вызывается (для новой программы server.py). Таким образом, глобальные команды (например, popen) выполняются, так как они выполняются один раз. – tfv