在 python 中跨两个程序发送数据
sending data across two programs 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)
我想在这里做的是,运行 socketcheck.py
运行s server.py
在后台监听客户端连接。因此,无论客户端发送什么数据,我都想将其传递给 socketcheck.py
。这有效吗?如果是这样,那我该如何实现?
现在,当我尝试 运行 socketcheck.py
时,for 循环无限期 运行ning。
谢谢:)
编辑:
最初我尝试将其作为单个程序,但在客户端连接之前,程序的其余部分不会执行(阻塞),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'
你的程序让你的电脑崩溃的原因很简单:
您有一个调用 print_from_server(data)
的 while
循环,每次调用它时,都会通过 subprocess.Popen(["python", "server.py"])
.
创建一个新的子进程
每次创建一个新的popen的原因有点复杂:你在socketcheck.py中打开了一个新的server.py程序。如果这个新的 server.py 程序调用 print_from_server(data),这是第一次 print_from_server(data) 被调用(对于新的 server.py 程序)。所以执行全局命令(例如popen),因为它们总是执行一次。
进程数运行会迅速爆炸,你的电脑会崩溃。
补充说明:您不能在子进程中使用 print
命令打印到控制台,因为该子进程没有附加控制台,您只能打印到文件。如果你这样做,你会看到这个输出从所有进程中迅速爆炸。
将 socketcheck.py 和 server.py 放入一个程序中,一切正常,或者解释为什么需要两个程序。
使用多线程可以轻松实现该功能:)
这是我的代码:
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
运行s server.py
在后台监听客户端连接。因此,无论客户端发送什么数据,我都想将其传递给 socketcheck.py
。这有效吗?如果是这样,那我该如何实现?
现在,当我尝试 运行 socketcheck.py
时,for 循环无限期 运行ning。
谢谢:)
编辑:
最初我尝试将其作为单个程序,但在客户端连接之前,程序的其余部分不会执行(阻塞),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'
你的程序让你的电脑崩溃的原因很简单:
您有一个调用 print_from_server(data)
的 while
循环,每次调用它时,都会通过 subprocess.Popen(["python", "server.py"])
.
每次创建一个新的popen的原因有点复杂:你在socketcheck.py中打开了一个新的server.py程序。如果这个新的 server.py 程序调用 print_from_server(data),这是第一次 print_from_server(data) 被调用(对于新的 server.py 程序)。所以执行全局命令(例如popen),因为它们总是执行一次。
进程数运行会迅速爆炸,你的电脑会崩溃。
补充说明:您不能在子进程中使用 print
命令打印到控制台,因为该子进程没有附加控制台,您只能打印到文件。如果你这样做,你会看到这个输出从所有进程中迅速爆炸。
将 socketcheck.py 和 server.py 放入一个程序中,一切正常,或者解释为什么需要两个程序。
使用多线程可以轻松实现该功能:)