繁体   English   中英

Python在不同模块之间共享单个套接字

[英]Python share single socket across different modules

我正在尝试建立一个套接字服务器,并在多个模块中使用它来将消息发送到客户端。

我在下面说的socket_server.py写了一个单例套接字。

import socket
class SocketServer:
    _instance=None
    def __init__(self):
        SocketServer.socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        SocketServer.socket.bind(("",5003))
        SocketServer.socket.listen(1)
        SocketServer._instance=self

    def post(self,message):
        SocketServer.socket.send(message)

    @staticmethod
    def getInstance():
        if not SocketServer._instance:
            SocketServer()
        return SocketServer._instance

我有一个模块(例如module_1.py),其中我使用上述套接字服务器作为

from socket_server import SocketServer
socket_server=SocketServer.getInstance()

我还有一个模块(例如module_2.py),我想使用在module_1.py中创建的套接字服务器。

from socket_server import SocketServer
socket_server=SocketServer.getInstance()

但是当我尝试同时执行这两个脚本时,我得到了两个不同的套接字服务器实例。

我希望能够创建一个套接字服务器,在module_1.py和module_2.py中使用相同的实例将消息发布到端口。

您如何使用此对象?
在这行SocketServer.socket.bind(("",5003))您正在显式绑定端口。
检查服务器ss -tpln上的端口列表是否已绑定端口5003?

$ ss -tpln
State              Recv-Q             Send-Q                         Local Address:Port                          Peer Address:Port                                                            
LISTEN             0                  50                                   0.0.0.0:46227                              0.0.0.0:*                 users:
LISTEN             0                  1                                    0.0.0.0:5003                               0.0.0.0:*                 users:(("python",pid=23404,fd=3))             

您不能在同一服务器上使用一个端口两次。 您会得到一个错误。

Traceback (most recent call last):
  File "/home/user/sock2.py", line 2, in <module>
    sock1 = SocketServer.getInstance()
  File "/home/user/sock.py", line 16, in getInstance
    SocketServer()
  File "/home/user/sock.py", line 6, in __init__
    SocketServer.socket.bind(("",5003))
OSError: [Errno 98] Address already in use

但是,如果您尝试从不同的服务器获取一个SocketServer的实例,则由于内存空间的不同,您将始终获得两个单独的端口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM