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'
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
Seltsam, wenn Sie eine Anweisung "print to file" anstelle von "popen" verwenden, wird sie wirklich nur einmal ausgeführt. – tfv
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