问题描述
我试图开发一个客户端服务器模块,其中我有 2 个文件 listen.py 和 server.py 用于服务器端和 client.py 用于客户端。
现在,我正在尝试实现多客户端服务器,因此我有 2 个单独的文件,其中 listen.py 创建一个套接字对象并侦听连接,一旦客户端连接,其套接字对象将附加到列表中并进行更新列表应该可以在 server.py 中访问
listen.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)
listen.py 的输出(隐藏 ip):
started listening on port 80
Got connection from : ('x.x.x.x',64486)
[<socket.socket fd=916,family=AddressFamily.AF_INET,type=SocketKind.soCK_STREAM,proto=0,laddr=('y.y.y.y',80),raddr=('x.x.x.x',64486)>]
在 server.py 中,我只是想打印更新的 conn_list:
import time
import listen
if __name__ == '__main__':
while True:
time.sleep(5)
print(listen.conn_list)
server.py 的输出:
[]
[]
[]
[]
[]
[]
[]
[]
正如我们所见,列表没有更新,因为我得到了一个空列表。我什至尝试使用 reload 库在 server.py 中重新加载模块“listen”,但没有运气,因为 reload 实际上重新加载了静态元素!
我想要做的就是在 server.py 中拥有该套接字对象以供进一步操作。
平台:Windows 10
Python:3.8.5
感谢任何帮助。
解决方法
这是我如何使用@quamrana 的建议做到的。
server.py
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)