我正在编写web应用程序,需要将数据从服务器推送到连接的客户端。这些数据可以从web应用程序的任何其他脚本中发送。例如,一个用户在服务器上做了一些更改,其他用户应该被告知这一点。
因此,我的想法是使用unix套接字(基于用户#ID的套接字路径)为相应的用户发送数据(web应用程序脚本将连接到这个套接字并写入数据)。第二部分是ThreadingTCPServer,它将接受用户连接,并通过TCP连接将数据从unix推送给用户。
以下是工作流程:
我希望你能理解我的想法:)
所以,我有两个问题:
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')发布于 2009-05-07 12:10:38
我认为您不应该使用unix套接字。如果您的应用程序(有一天)会变得流行或任务关键,您将不能仅仅添加另一台服务器来增加可伸缩性或使其冗余和故障安全。
另一方面,如果你将数据放入f.e。memcached (以及用户的“数据集号”作为单独的键)您将能够从多个服务器将数据放入memcached,并从多个服务器读取数据。如果用户将断开连接并与其他服务器连接,您仍然可以为他获取数据。
您也可以使用数据库(使其更加安全),或者使用数据库和memcached的混合(如果您愿意的话),但是我已经看到一个应用程序使用unix套接字的方式,而程序员后来又后悔了。该表可以有userid、data和时间戳列,并且您可以记住给定用户的最后一个时间戳。
发布于 2009-05-07 12:08:26
这太复杂了。请使用套接字服务器模块。
发布于 2009-06-17 03:56:57
您应该使用Twisted,或者更具体地说,使用绕轨道将数据推送到客户端。您发布的示例代码有许多潜在的问题,要弄清楚它们都是什么要比只使用预先构建的代码来满足您的需要要困难得多。
https://stackoverflow.com/questions/833962
复制相似问题