Я пишу веб-приложение, в котором мне нужно отправить данные с сервера на подключенные клиенты. Эти данные можно отправить из любого другого скрипта из веб-приложения. Например, один пользователь вносит некоторые изменения на сервере, а другие пользователи должны быть уведомлены об этом.
Так что моя идея заключается в том, чтобы использовать сокет unix (путь к сокету на основе идентификатора пользователя #) для отправки данных для соответствующего пользователя (сценарии веб-приложения будут подключаться к этому сокету и записывать данные). Вторая часть - это ThreadingTCPServer, который будет принимать пользовательские соединения и передавать данные из сокета unix пользователю через соединение через сокет TCP.
Вот рабочий процесс:
- Используется подключение к TCP-серверу
- Скрипт Django открывает unixsocket и записывает в него данные.
- TCP-сервер считывает данные из сокета unix и отправляет их для открытия соединения с пользователем.
Надеюсь, вы понимаете мою идею:)
Итак, у меня есть 2 вопроса:
1.Что вы думаете о моей идее в целом? Это хорошее или плохое решение? Любые рекомендации приветствуются.
2. Вот мой код.
import SocketServer
import socket
import netstring
import sys, os, os.path
import string
import time
class MyRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
try:
print "Connected:", self.client_address
user = self.request.recv(1024).strip().split(":")[1]
user = int(user)
self.request.send('Welcome #%s' % user)
self.usocket_path = '/tmp/u%s.sock' % user
if os.path.exists(self.usocket_path):
os.remove(self.usocket_path)
self.usocket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
self.usocket.bind(self.usocket_path)
self.usocket.listen(1)
while 1:
usocket_conn, addr = self.usocket.accept()
while 1:
data = usocket_conn.recv(1024)
if not data: break
self.request.send(data)
break
usocket_conn.close()
time.sleep(0.1)
except KeyboardInterrupt:
self.request.send('close')
self.request.close()
myServer = SocketServer.ThreadingTCPServer(('', 8081), MyRequestHandler)
myServer.serve_forever()
и я получил исключение
File "server1.py", line 23, in handle
self.usocket.listen(1)
File "<string>", line 1, in listen
error: (102, 'Operation not supported on socket')