asyncore 服务器:请求导致 "socket.error'>:[Errno 32] Broken pipe)
我正在写一个异步服务器,它从同一个进程中的另一个模块获取信息,并把这些信息写回给客户端。这个信息基本上是一个字典,每个键对应一个消息队列。我需要输出每个队列的长度。代码在测试机器上运行得很好,但一旦我把它安装到生产服务器上,就开始出现以下错误信息:“socket.error'>:[Errno 32] Broken pipe)”。
这是服务器的代码:
class request_handler (asyncore.dispatcher):
def __init__(self, conn_sock, client_address, dict):
self.client_address = client_address
self.buffer = ""
self.dict = dict
asyncore.dispatcher.__init__(self, conn_sock)
def readable(self):
return True
def writable(self):
return False
def handle_read(self):
data = self.recv(SIZE)
mtats = "msgq-stats"
if data:
buffer = data
if buffer.lower() == mstats.lower():
msgout = "-- Message Queue Stats --\n"
for key, value in dict.items():
mq = 0
if dict[key].message_queue:
mq = len(dict[key].message_queue)
msgout += key + ":" + str(mq) + "\n"
self.send(msgout)
else: self.send("Invalid input\n")
else:
self.send("Invalid input\n")
def handle_write(self):
print ("--Handling read--\n")
def handle_close(self):
pass
# ---------------------------------------------------------------------
class monitor_server (asyncore.dispatcher):
def __init__ (self, ip, port, destination):
sys.path.append('/path/')
import dict
self.ip = ip
self.port = port
self.dict = dict
asyncore.dispatcher.__init__ (self)
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind ((ip, port))
self.listen (5)
def writable (self):
return 0
def handle_read (self):
pass
def readable (self):
return self.accepting
def handle_connect (self):
pass
def handle_accept (self):
(conn_sock, client_address) = self.accept()
request_handler (conn_sock, client_address, self.destination)
这是客户端的代码:
class Client(asyncore.dispatcher_with_send):
def __init__(self, host, port, message):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((host, port))
print "Message being sent is "
print message
self.out_buffer = message
def handle_close(self):
self.close()
def handle_read(self):
print self.recv(1024)
self.close()
c = Client('', 6000, 'msgq-stats')
asyncore.loop()
提前谢谢你。
1 个回答
0
这是一个你需要处理的错误情况。有时候连接会关闭。这种情况在开发过程中遇到的各种socket错误,和在正式环境中遇到的会有所不同,因为可能出现的错误种类很多,几乎完全取决于执行环境,以及连接另一端的程序在做什么,还有客户端和服务器之间的所有路由器的决定。
所以,直接回答你的问题就是,你需要在你的应用代码中处理这个和其他很多socket错误。这是使用asyncore时你需要做的一部分工作。当出现这种情况时,添加必要的异常处理,并将连接标记为已关闭。
一个稍微更好的建议是,有一些更高级的工具可以让网络编程变得更简单,你可能应该考虑使用这些工具。在这个领域,最重要的工具是Twisted。