Je suis en train d'écrire une application Web dans laquelle je dois transférer des données du serveur vers les clients connectés. Ces données peuvent être envoyées à partir de n'importe quel autre script à partir d'une application Web. Par exemple, un utilisateur apporte des modifications sur le serveur et les autres utilisateurs doivent être avertis à ce sujet.Filetage du serveur TCP en tant que proxy entre l'utilisateur connecté et le socket unix
Donc, mon idée est d'utiliser le socket unix (chemin vers la prise en fonction de #ID utilisateur) pour envoyer des données pour l'utilisateur correspondant (scripts d'applications Web se connecte à cette prise et écrire des données). La deuxième partie est ThreadingTCPServer qui acceptera les connexions utilisateur et transmettra les données du socket unix à l'utilisateur via la connexion TCP.
Voici le flux de travail:
- occasion se connecter au serveur TCP
- Django scénario unixsocket ouvert et écrire des données.
- TCP Server lit les données du socket unix et les envoie pour ouvrir la connexion avec l'utilisateur.
J'espère que vous comprenez mon idée :)
Donc, j'ai 2 questions:
1.Quels pensez-vous de mon idée en général? Est-ce une bonne ou une mauvaise solution? Toutes les recommandations sont les bienvenues.
2.Voici mon code.
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()
et je suis une exception
File "server1.py", line 23, in handle
self.usocket.listen(1)
File "<string>", line 1, in listen
error: (102, 'Operation not supported on socket')
La deuxième question a été résolue. socket.SOCK_STREAM doit être utilisé à la place de socket.SOCK_DGRAM dans le socket UNIX. –