我正在尝试建立一个套接字服务器,并在多个模块中使用它来将消息发送到客户端。
我在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中使用相同的实例将消息发布到端口。
答案 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的实例,则由于内存空间的不同,您将始终获得两个单独的端口。