Python 将TCP服务器作为连接的用户和unix套接字之间的代理线程

Python 将TCP服务器作为连接的用户和unix套接字之间的代理线程,python,multithreading,sockets,tcp,Python,Multithreading,Sockets,Tcp,我正在编写web应用程序,需要将数据从服务器推送到连接的客户端。此数据可以从web应用程序的任何其他脚本发送。例如,一个用户在服务器上做了一些更改,其他用户应该得到通知 所以我的想法是使用unix套接字(基于用户ID的套接字路径)为相应的用户发送数据(web应用程序脚本将连接到此套接字并写入数据)。第二部分是ThreadingCpserver,它将接受用户连接,并通过TCP套接字连接将数据从unix套接字推送到用户 以下是工作流程: 用于连接到TCP服务器 Django脚本打开unixsocke

我正在编写web应用程序,需要将数据从服务器推送到连接的客户端。此数据可以从web应用程序的任何其他脚本发送。例如,一个用户在服务器上做了一些更改,其他用户应该得到通知

所以我的想法是使用unix套接字(基于用户ID的套接字路径)为相应的用户发送数据(web应用程序脚本将连接到此套接字并写入数据)。第二部分是ThreadingCpserver,它将接受用户连接,并通过TCP套接字连接将数据从unix套接字推送到用户

以下是工作流程:

  • 用于连接到TCP服务器
  • Django脚本打开unixsocket并向其中写入数据
  • TCP服务器从unix套接字读取数据并将其发送到与用户的open连接
  • 我希望你能理解我的想法:)

    因此,我有两个问题:

    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')
    
    文件“server1.py”,第23行,在句柄中
    self.usocket.listen(1)
    文件“”,第1行,在listen中
    错误:(102,‘套接字上不支持操作’)
    
    这太复杂了。请使用模块

    我认为您不应该使用unix套接字。如果你的应用程序(有朝一日)会变得流行或关键任务,你就不能仅仅添加另一台服务器来增加可伸缩性,或者使其冗余和故障安全

    另一方面,如果您将数据放入f.e.memcached(并将用户的“数据集编号”作为单独的键),您将能够从多个服务器将数据放入memcached,并从多个服务器读取数据。如果用户将断开连接并从其他服务器重新连接,您仍然可以为他获取数据


    您也可以使用数据库(使其更安全),或者如果您愿意,也可以混合使用数据库和memcached,但我看到过一个应用程序以您尝试的方式使用unix套接字,程序员后来对此表示遗憾。该表可以有userid、data和timestamp列,您可以记住给定用户的最后一个时间戳。

    您应该使用Twisted,或者更具体地说,将数据推送到客户端。您发布的示例代码有许多潜在问题,要想弄清楚它们都是什么比只使用一段预构建的代码来做您需要的事情要困难得多。

    myServer=SocketServer.threadingcpserver(“”,8081),MyRequestHandler)不是吗?这就是所说的最大连接用户数,比方说,同时有1000个用户。我认为一台服务器处理1000个连接并不重要。当然,数据库是用于此目的的。谢谢你的memcached解决方案,我会考虑的。。但不确定是否有可能“监听”新数据,而不是每秒钟检查一次。例如,你真的真的需要数据吗?在大多数情况下,你不会。我承认,有时候你会,但不像人们想象的那么频繁。顺便说一句:如果你增加ulimit,你可以得到超过1000个开放的插座。第二个问题已经解决了。在UNIX套接字中,应使用socket.SOCK_流而不是socket.SOCK_DGRAM。