2016-04-13 7 views
1

Dies ist mein Code:Senden von Daten über zwei Programme in Python

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) 

Was Ich versuche hier zu tun ist,laufen, die server.py im Hintergrund ausgeführt wird und auf eine Clientverbindung wartet. Also, welche Daten auch immer der Client sendet, ich möchte es an socketcheck.py weiterleiten. Ist das gültig? Wenn ja, wie erreiche ich es?

Jetzt, wenn ich versuche und socketcheck.py ausführen, läuft die for-Schleife unbegrenzt.

Thanks :)

EDIT:

Das anfänglich ich als ein Programm versucht, aber bis der Client verbunden wird, wird der Rest des Programms nicht (Blockierung) ausführen, mit den setblocking(0) der Der Programmfluss würde nicht stoppen, aber wenn der Client eine Verbindung zum Server herstellt, wird er nicht gedruckt. Der Server-Code sah etwa so aus:

Import Buchse von socketcheck Import 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' 

Antwort

0

Der Grund, warum Ihr Programm stürzt Ihr Computer ist einfach: Sie haben eine while Schleife, die print_from_server(data) nennt, und jedes Mal, es ruft es auf, ein neuer Subprozess wird über subprocess.Popen(["python", "server.py"]) erstellt.

Der Grund für das Erstellen eines neuen Popens jedes Mal ist ein bisschen komplizierter: Sie öffnen ein neues server.py-Programm in socketcheck.py. Wenn dieses neue server.py-Programm print_from_server (data) aufruft, wird print_from_server (data) zum ersten Mal aufgerufen (für das neue server.py-Programm). So werden die globalen Befehle (zB popen) ausgeführt, da sie immer einmal ausgeführt werden.

Die Anzahl der ausgeführten Prozesse explodiert schnell und Ihr Computer stürzt ab.

Eine weitere Bemerkung: Sie können nicht mit einem print Befehl in einem Unterprozess auf Konsole drucken, da keine Konsole an diesen Unterprozess angeschlossen ist, können Sie nur in Datei drucken. Wenn Sie das tun, werden Sie sehen, dass diese Ausgabe schnell von allen Prozessen explodiert.

Setzen Sie socketcheck.py und server.py in ein Programm und alles funktioniert gut, oder erklären Sie, warum Sie zwei Programme benötigen.

+0

leicht erreicht aber hier in socketcheck.py definiert Ich versuche, die Argumente an eine Funktion zu übergeben, also warum ein neuer Teilprozess wird jedes Mal erstellt werden? Sollte es nicht einfach die Funktion print_from_server aufrufen? – Anusha

+0

Seltsam, wenn Sie eine Anweisung "print to file" anstelle von "popen" verwenden, wird sie wirklich nur einmal ausgeführt. – tfv

+0

Ich habe das jetzt verstanden: Sie öffnen ein neues server.py Programm in socketcheck.py. Wenn dieser neue Server.py Programm ruft print_from_server (data) auf, dies ist der erste Aufruf (für das neue server.py Programm). So werden die globalen Befehle (zB popen) ausgeführt, da sie einmal ausgeführt werden. – tfv

0

Die Funktionalität mit Multithreading werden kann :)

Verwandte Themen