2016-01-13 33 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:]),爲它們所包含的傾倒對象的長度

我沒有找到在這個信息日誌記錄模塊文檔 - 有時會有人去源(或只是谷歌更難)。

相關問題