2014-04-24 60 views
1

我有一個網絡傳感器發送XML警報,然後我們可以解析出各種原因使用。在我的情況下,我想要使用這些警報來解析出警報ID,以便我可以從傳感器中取出保存的項目,並將其保存爲以下格式:線程服務器從網絡傳感器接收XML警報

我打算處理這個問題的方式是我將有一臺服務器在Linux系統上監聽,並且每當我感興趣的項目(例如報告)被保存在傳感器上時,傳感器就會向該系統發送警報。

我在Python中創建了一個簡單的套接字服務器,它接受傳入的連接,但對Python來說是新手我很好奇是否有更好的方法來實現服務器。我已經看到了一些使用ServerSocket而不是socket的建議,只是對更有經驗的開發人員感興趣。我也想實現一個套接字超時或其他一些功能來在套接字上沒有更多數據時關閉套接字。我試過socket.settimeout(),但套接字只是立即關閉,所以現在我有一個臨時佔位符,我可以從客戶端發送「關閉」來關閉套接字。

任何幫助和建議將不勝感激。工作代碼如下,請注意它的髒,因爲我是Python新手。

from socket import * 
import thread 

# Server parameters 
HOST = '' 
PORT = 8000 
ADDR = HOST, PORT 
BUFF = 4096 

def handler(clientsock,addr): 
    while 1: 
     data = clientsock.recv(BUFF) 
     if not data: 
     break 
     clientsock.send(response(data)) 

     # Closes the connection 
     # Temp until I can get timeout to work 
     if data.rstrip() == "close": 
     break 

    clientsock.close() 

    print addr, "- closed connection" #log on console 

def response(data): 
     return 'Data sent: ' + data 

if __name__=='__main__': 
    server = socket(AF_INET, SOCK_STREAM) 
    server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 

    try: 
     server.bind(ADDR) 
     server.listen(5) 
    except sock.error as msg: 
     print('Unable to bind to ', ADDR) 
     print('Error code: ', msg[0]) 
     print('Message: ', msg[1]) 

    while 1: 
     print 'waiting for connection... listening on port', PORT 
     clientsock, addr = server.accept() 
     print '...connected from:', addr 
     thread.start_new_thread(handler, (clientsock, addr)) 

謝謝!

+0

經過一番閱讀後,也許我應該利用socket.settimeout()或setdefaulttimeout()f或關閉套接字以防止擁塞的目的?另外從閱讀它似乎我應該使用ServerSocket而不是隻是套接字類。 – user3569125

回答

0

嗨,你需要使用的對象,做你想做什麼:

創建一個套接字服務器:

from socket import * 
import threading 
class ThController(threading.Thread): 

    # Override Thread's __init__ method to accept the parameters needed: 
    def __init__(self,parent): 
     print 'Init server controller' 
     self.port = 4001 
     self.server = socket(AF_INET, SOCK_STREAM) 
     self.server.bind(('localhost', self.port)) 
     self.server.listen(5) 
     self.parent = parent 
     threading.Thread.__init__ (self) 

    def run (self): 
     while self.parent.ctrlattive: 
      connection, address = self.server.accept() 
      data = connection.recv(1024) 
      self.parent.data=data 

爲istantiate對象THEAD第二類:

class MainCtrl(): 
    def __init__(self): 
     super(MainCtrl,self).__init__() 
     self.data=None 
     self.ctrlattive=True 
     self.drivectrl=Sctrl.ThController(self) 
     self.drivectrl.start() 

    def load_data(self): 
     #decode data here 
     print self.data 

test=MainCtrl() 
while 1: 
    test.load_data() 

希望這幫你

+0

感謝您的回覆。無可否認,我很難理解你的代碼,而且我也無法讓它無誤地運行。做一些閱讀它看起來像我可能需要使用socket.settimeout()? – user3569125