Python 在一个脚本中更新列表并从另一个脚本访问更新的列表
我试图开发一个客户机-服务器模块,其中服务器端有两个文件listen.py和server.py,客户端有两个文件client.py 现在,我正在尝试实现多客户端服务器,因此我有两个单独的文件,其中listen.py创建一个套接字对象并侦听连接,一旦客户端连接,它的套接字对象将附加到一个列表中,更新后的列表应该可以在server.py中访问 两个文件的代码和输出: listen.pyPython 在一个脚本中更新列表并从另一个脚本访问更新的列表,python,sockets,server,client,shared-objects,Python,Sockets,Server,Client,Shared Objects,我试图开发一个客户机-服务器模块,其中服务器端有两个文件listen.py和server.py,客户端有两个文件client.py 现在,我正在尝试实现多客户端服务器,因此我有两个单独的文件,其中listen.py创建一个套接字对象并侦听连接,一旦客户端连接,它的套接字对象将附加到一个列表中,更新后的列表应该可以在server.py中访问 两个文件的代码和输出: listen.py import socket conn_list = [] if __name__ == '__main__':
import socket
conn_list = []
if __name__ == '__main__':
try:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(1)
sock.bind(('0.0.0.0',80))
print('started listening on port 80')
sock.listen(10)
while True:
vconn,addr = sock.accept()
print('Got connection from : ',addr)
conn_list.append(vconn)
conn_list = []
def listen(child_pipe):
try:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(1)
sock.bind(('0.0.0.0',80))
print('started listening on port 80')
sock.listen(10)
while True:
vconn,addr = sock.accept()
child_pipe.send(vconn)
except Exception as e:
print(str(e))
if __name__ == '__main__':
parent_pipe, child_pipe = multiprocessing.Pipe()
p = multiprocessing.Process(target=listen, args=(child_pipe,))
p.daemon = True
p.start()
while True:
time.sleep(2)
msg = parent_pipe.recv()
if msg:
conn_list.append(msg)
print(conn_list)
listen.py的输出(隐藏ip):
server.py的输出:
[]
[]
[]
[]
[]
[]
[]
[]
正如我们所看到的,列表并没有得到更新,因为我得到了一个空列表。我甚至尝试过使用reload library在server.py中重新加载模块“listen”,但没有成功,因为reload实际上重新加载了静态元素
我所要做的就是在server.py中包含该套接字对象,以便进行进一步的操作
平台:视窗10
Python:3.8.5
非常感谢您的帮助。以下是我如何使用@quamrana的建议完成的 server.py
import socket
conn_list = []
if __name__ == '__main__':
try:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(1)
sock.bind(('0.0.0.0',80))
print('started listening on port 80')
sock.listen(10)
while True:
vconn,addr = sock.accept()
print('Got connection from : ',addr)
conn_list.append(vconn)
conn_list = []
def listen(child_pipe):
try:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(1)
sock.bind(('0.0.0.0',80))
print('started listening on port 80')
sock.listen(10)
while True:
vconn,addr = sock.accept()
child_pipe.send(vconn)
except Exception as e:
print(str(e))
if __name__ == '__main__':
parent_pipe, child_pipe = multiprocessing.Pipe()
p = multiprocessing.Process(target=listen, args=(child_pipe,))
p.daemon = True
p.start()
while True:
time.sleep(2)
msg = parent_pipe.recv()
if msg:
conn_list.append(msg)
print(conn_list)
听起来像是在不同的进程中运行
python listen.py
和python server.py
。您可能需要让server.py
为listen.py
@quamrana中的函数启动一个线程谢谢您的建议。我使用了multiprocessing.pipe
在两个进程之间传递对象,它工作得很好!此外,所有代码都包含在一个server.py
文件中,因此listen.py
中的所有内容现在都位于server.py
中。