2016-04-13 2 views
1

Это мой код:отправки данных через две программы в питона

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' 

ответ

0

Причина, почему ваша программа падает ваш компьютер прост: У вас есть while цикла, который вызывает print_from_server(data), и каждый раз, он вызывает это, новый подпроцесс создается через subprocess.Popen(["python", "server.py"]).

Причина для создания нового popen каждый раз немного сложнее: вы открываете новую server.py программу в socketcheck.py. Если эта новая программа server.py вызывает print_from_server (данные), это первый раз, когда вызывается print_from_server (data) (для новой программы server.py). Таким образом, глобальные команды (например, popen) выполняются, так как они всегда выполняются один раз.

Количество запущенных процессов быстро разразится, и компьютер выйдет из строя.

Еще одно замечание: вы не можете печатать на консоль командой print в подпроцессе, поскольку к этому подпроцессу не подключена консоль, вы можете печатать только в файл. Если вы это сделаете, вы увидите, что этот результат быстро взрывается из всех процессов.

Вставьте socketcheck.py и server.py в одну программу, и все работает нормально или объясните, почему вам нужны две программы.

+0

Но здесь я пытаюсь передать аргументы функции, определенной в socketcheck.py, так почему новый подпроцесс создается каждый раз? Не следует ли просто вызвать функцию print_from_server? – Anusha

+0

Странно, если вы используете инструкцию print для файла вместо popen, она действительно выполняется только один раз. – tfv

+0

Я понял это сейчас: вы открываете новую server.py программу в socketcheck.py. Если этот новый сервер.py вызывает print_from_server (данные), это первый раз, когда он вызывается (для новой программы server.py). Таким образом, глобальные команды (например, popen) выполняются, так как они выполняются один раз. – tfv

0

Функциональность может быть легко достигнуто с многопоточной :)