生活随笔
收集整理的這篇文章主要介紹了
python模拟地面网管接收数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://pan.baidu.com/s/1_BvoHPaUZXEnTqTNBcviNw
提取碼:edg0
復制這段內容后打開百度網盤手機App,操作更方便哦
# -*- coding: utf-8 -*
import socket
import threading
import SocketServerimport Queue
import timequeue_list = {}
client_list = []
socketdatalist = {}
#線程句柄,處理每個線程內收到的監控板數據
class ThreadedUDPRequestHandler(SocketServer.BaseRequestHandler):def handle(self):data = self.request[0]socket = self.request[1]#打印收到的監控板的ip和端口號print "\r\n 服務器已連接 from: ", self.client_address[0],"\t port:",self.client_address[1]#print "\r\n 服務器已連接 接收數據為: ", data#釋放系統資源del socketdel data#該類會啟動線程句柄
class TYThreadingMixIn:"""Mix-in class to handle each request in a new thread."""# Decides how threads will act upon termination of the# main processdaemon_threads = Falsedef process_request_thread(self,queue, client_address):"""Same as in BaseServer but as a thread.In addition, exception handling is done here."""while True:try:#隊列為阻塞型,如果沒有數據則線程處理暫停task = queue.get(block=True,timeout=10)except Queue.Empty:cur_thread = threading.current_thread()log="Thread:name{} NO.{} client {} queue timeout over!".format(cur_thread.name, cur_thread.ident, client_address)client_name = ("{}_{}".format(client_address[0], client_address[1]))client_list.remove(client_name)queue_list.pop(client_name)print logbreak#print taskqueue.task_done()try:self.finish_request(task, client_address)self.shutdown_request(task)except:self.handle_error(task, client_address)self.shutdown_request(task)#啟動一個新的線程,處理每個新增加的監控板地址def process_request(self, request, client_address):"""Start a new thread to process the request."""client_name = ("{}_{}".format(client_address[0], client_address[1]))#如果監控板的ip沒有在list中,則在隊列中新增一條監控板地址信息if client_name not in client_list:client_list.append(client_name)queue_list[client_name] = Queue.Queue(100)#啟動一個線程,進行超時處理,如果10秒鐘未接受到監控板的數據,則刪除該監控板線程t = threading.Thread(target = self.process_request_thread,args = (queue_list[client_name], client_address),name=client_name)t.daemon = self.daemon_threadst.start()#在隊列中假如新的監控板地址信息queue_list[client_name].put(request)def client(ip, port, message, name, cycle=0):sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#sock.connect((ip, port))try:for i in range(0,cycle):sock.sendto("{} cnt {}".format(message,i),(ip, port))response = sock.recvfrom(65536)print "Client{}:get: {}".format(name,response)finally:sock.close()class TYThreadingUDPServer(TYThreadingMixIn, SocketServer.UDPServer): pass#主函數
if __name__ == "__main__":#綁定ip和端口,目前設定為綁定所有ip的11111端口HOST, PORT = "0.0.0.0", 11111server = TYThreadingUDPServer((HOST, PORT), ThreadedUDPRequestHandler)ip, port = server.server_address# 啟動一個socket線程池server_thread = threading.Thread(target=server.serve_forever)# Exit the server thread when the main thread terminatesserver_thread.daemon = Trueserver_thread.start()print "Server loop running in thread:", server_thread.nameserver_thread.join()#進程等待,該主進程等待所有的線程結束while True:time.sleep(5)try:i=1#for k,v in queue_list.iteritems():# print i,":",k# i=i+1except:server.shutdown()server.server_close()finally:pass#釋放系統資源server.shutdown()server.server_close()
轉載于:https://blog.51cto.com/zhaoanan/2400036
總結
以上是生活随笔為你收集整理的python模拟地面网管接收数据的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。