2016-01-13 58 views
1

从取消记录器中取出数据时存在一些问题。鉴于udp_server:在UDP服务器中取消数据从记录器发送EOFError错误

import pickle 
import logging 
import logging.handlers 
import socketserver 
import struct 

class MyUDPHandler(socketserver.BaseRequestHandler): 

    def handle(self): 
     data = self.request[0].strip() 
     socket = self.request[1] 
     print("{} wrote:".format(self.client_address[0])) 
     print(self.unPickle(data)) # here is problem 
     socket.sendto(data.upper(), self.client_address) 

    def unPickle(self, data): 
     return pickle.loads(data) 

class LogRecordSocketReceiver(socketserver.UDPServer): 
    allow_reuse_address = True 

    def __init__(self, host='localhost', 
       port=logging.handlers.DEFAULT_TCP_LOGGING_PORT, 
       handler=MyUDPHandler): 
     socketserver.UDPServer.__init__(self, (host, port), handler) 
     self.abort = 0 
     self.timeout = 1 
     self.logname = None 

    def serve_until_stopped(self): 
     import select 
     abort = 0 
     while not abort: 
      rd, wr, ex = select.select([self.socket.fileno()], 
             [], [], 
             self.timeout) 
     if rd: 
      self.handle_request() 
     abort = self.abort 

if __name__ == "__main__": 
    tcpserver = LogRecordSocketReceiver() 
    print('About to start UDP server...') 
    tcpserver.serve_until_stopped() 

而且udp_log_sender:

import logging, logging.handlers 

rootLogger = logging.getLogger('') 
rootLogger.setLevel(logging.DEBUG) 

udp_handler = logging.handlers.DatagramHandler("localhost", logging.handlers.DEFAULT_TCP_LOGGING_PORT)  
rootLogger.addHandler(udp_handler) 

logging.info('Jackdaws love my big sphinx of quartz.') 

当服务器收到
日志消息,并希望运行unPickleEOFError被抛出。什么会导致这种行为?

回答

1
  1. 不剥离的二进制数据
  2. 省略第一个4个字节(即利用数据[4:]),为它们所包含的倾倒对象的长度

我没有找到在这个信息日志记录模块文档 - 有时会有人去源(或只是谷歌更难)。

相关问题