首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程TCP服务器作为连接用户与unix套接字之间的代理

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

Stack Overflow用户
提问于 2009-05-07 10:46:21
回答 3查看 2.1K关注 0票数 0

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

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

以下是工作流程:

  1. 用于连接到TCP服务器
  2. Django脚本打开unixsocket并向其写入数据。
  3. TCP Server从unix套接字中读取数据,并将其发送到打开与用户的连接。

我希望你能理解我的想法:)

所以,我有两个问题:

1.你对我的总体想法有何看法?是好的还是坏的解决办法?欢迎提出任何建议。

2.这是我的密码。

代码语言:javascript
复制
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()

我有个例外

代码语言:javascript
复制
  File "server1.py", line 23, in handle
    self.usocket.listen(1)
  File "<string>", line 1, in listen
error: (102, 'Operation not supported on socket')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-07 12:10:38

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

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

您也可以使用数据库(使其更加安全),或者使用数据库和memcached的混合(如果您愿意的话),但是我已经看到一个应用程序使用unix套接字的方式,而程序员后来又后悔了。该表可以有userid、data和时间戳列,并且您可以记住给定用户的最后一个时间戳。

票数 1
EN

Stack Overflow用户

发布于 2009-05-07 12:08:26

这太复杂了。请使用套接字服务器模块。

票数 0
EN

Stack Overflow用户

发布于 2009-06-17 03:56:57

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/833962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档