【发布时间】:2018-03-19 00:38:05
【问题描述】:
我正在合作:
- Django 1.11
- Python 套接字
我有一个这样的 Socket 服务器:
class SocketServer(threading.Thread):
def __init__(self, ip="127.0.0.1", port=5000, _buffer=1024):
super(RoomSocketServer, self).__init__()
self.IP = ip
self.PORT = port
self.RECV_BUFFER = _buffer # Advisable to keep it as an exponent of 2
self.CONNECTION_LIST = [] # list of socket clients
self.MESSAGE_QUEUES = {} # List of message queue by socket
self.OUTPUTS = []
self.SERVER = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# this has no effect, why ?
self.SERVER.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.SERVER.bind((self.IP, self.PORT))
self.SERVER.listen(10)
# Add server socket to the list of readable connections
self.CONNECTION_LIST.append(self.SERVER)
self.ROOM = Room.objects.create(port=port, ip=ip, type_room=type_room)
def read_sockets(self, read_sockets):
''' ... '''
def write_sockets(self, write_sockets):
''' ... '''
def error_sockets(self, error_sockets):
''' ... '''
def run(self):
while 1:
# Get the list sockets which are ready to be read through select
read_sockets, write_sockets, error_sockets = select.select(self.CONNECTION_LIST, self.OUTPUTS, [])
# Read sockets
self.read_sockets(read_sockets)
self.write_sockets(write_sockets)
self.error_sockets(error_sockets)
self.SERVER.close()
我可以像这样在 Django 上的任何地方运行这个 SocketServer(自定义命令、视图、芹菜...):
from socket_server import SocketServer
socket_server = SocketServer()
socket_server.start()
# And the code continues while the socket server is running
# I would like to save socket_server instance anywhere to access
# Later from anywhere or trigger a signal to finish it
就像我上面说的,我想知道(如果可能的话)你们中的任何人会将服务器实例保存在哪里,以便从 Django 项目的不同部分访问它?
更新
我尝试在 Django 上使用 memcached,但是当我尝试将 SocketServer 实例存储在 memcached 上时,我收到此错误:
PicklingError: Can't pickle : 属性查找 thread.lock 失败
【问题讨论】:
-
好问题,您的域中的服务器用于什么或服务器后面是什么?
-
Django-Channels 使用 Redis。也许 Channels 是更简单的解决方案?
-
感谢您的 cmets,我会检查 Django-Channels。现在我只是用 manage.py runserver 检查本地,但后来我想我会让 apache 或 nginx 作为 web 服务器运行
-
@AlvaroAV,您找到解决方案了吗?我还在运行一个 django 应用程序,它使用 ssl 套接字与固件连接,使用 Django rest 框架进行 UI 连接。我也很困惑在 Django 文件中添加什么以便启动套接字服务器。