2014-04-24 62 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