Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一个脚本中更新列表并从另一个脚本访问更新的列表_Python_Sockets_Server_Client_Shared Objects - Fatal编程技术网

Python 在一个脚本中更新列表并从另一个脚本访问更新的列表

Python 在一个脚本中更新列表并从另一个脚本访问更新的列表,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__':

我试图开发一个客户机-服务器模块,其中服务器端有两个文件listen.pyserver.py,客户端有两个文件client.py

现在,我正在尝试实现多客户端服务器,因此我有两个单独的文件,其中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)
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
中。