【问题标题】:Update list in one script and access updated list from another script在一个脚本中更新列表并从另一个脚本访问更新的列表
【发布时间】:2021-02-03 15:52:12
【问题描述】:

我正在尝试开发一个客户端服务器模块,其中我有 2 个文件 listen.pyserver.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

感谢任何帮助。

【问题讨论】:

  • 听起来你在不同的进程中运行python listen.pypython server.py。您可能需要让server.pylisten.py 中的函数启动一个线程。
  • @quamrana 感谢您的建议。我使用multiprocessing.pipe 在两个进程之间传递对象,它工作正常!此外,所有代码都包含在单个 server.py 文件中,因此 listen.py 中的所有内容现在都在 server.py 中。

标签: python sockets server client shared-objects


【解决方案1】:

这是我使用@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多