【问题标题】:Python share single socket across different modulesPython 在不同模块之间共享单个套接字
【发布时间】:2019-04-22 05:11:37
【问题描述】:

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

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

【问题讨论】:

  • "当我尝试同时执行这两个脚本时" 您正在分别运行这些脚本吗?在解释器的两个实例中?那么你永远不会得到套接字的对象。
  • 您正在尝试将多个 python 进程绑定到单个端口。虽然这在技术上是可行的,但我认为这不是您想要做的;通常,您将单个进程绑定到 IP:PORT 套接字。我也看不出将多个服务器进程绑定到同一个端口将如何帮助您向客户端发送消息。

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


【解决方案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 的实例,你总是会得到两个独立的端口,因为内存空间不同。

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多