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

时间:2019-04-22 05:11:37

标签: python python-3.x sockets python-sockets

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

我在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中使用相同的实例将消息发布到端口。

1 个答案:

答案 0 :(得分:1)

您如何使用此对象?
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的实例,则由于内存空间的不同,您将始终获得两个单独的端口。