Python разделяет один сокет между различными модулями - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь установить сервер сокетов и использовать его в нескольких модулях для отправки сообщений клиенту.

Я написал одноэлементный сокет, скажем, 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 Ответ

1 голос
/ 22 апреля 2019

Как вы используете этот объект?
В этой строке 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 с разных серверов, вы всегда получите два отдельных порта из-за разного пространства памяти.

...