is divided into two parts, one for updating the data, and the other for responding to client requests.
From Socketserver import TCPServer, streamrequesthandlerfrom time import ctimefrom socketserver Import Threadingtcpserverimport tracebackimport Threadingmutex = Threading. Lock () HOST = "127.0.0.1" #HOST = "121.40.152.123" PORT_RECV = 6000addr_recv = (host,port_recv) Int = [I for I in range (101) ]dict_ele = {' 001 ': ' + '} for I in range (101): Key_ele = str (i) If Len (key_ele) = = 1:key_ele = ' xx ' + key_el E dict_ele.update ({key_ele: "{"}) Elif len (key_ele) = = 2:key_ele = ' 0 ' + key_ele dict_ele.update ({key_ele: "}") Else:dict_ele.update ({key_ele: "}") Class Recv_data_from_vehicle_requesthandle (streamreques Thandler): def handle (self): #data = self.rfile.readline () data = SELF.REQUEST.RECV (1024x768) If Len (d ATA) = = 12:if Data[0] = = ' $ ' and data[10:12] = = ' \ r \ n ': Key = data[3:6] Value = DATA[7:10] If Key.isdigit (): If int (Key) <= and int (KeY) >= 0:mutex.acquire () dict_ele.update ({key:value}) #need protect Print Key,dict_ele[key] Mutex.release () self.wfile.write (d Ict_ele[key]) else:print "Overflow" else:p Rint "Key Error" else:print "bit error!" Else:print "Recv error!" Def recv_data_from_vehicle (): Tcpserv = Threadingtcpserver (addr_recv,recv_data_from_vehicle_requesthandle) TcpServ. Serve_forever () class Query_data_requesthandle (Streamrequesthandler): def handle (self): if 1:try: #data = "$NUM 001\r\n" #print len (data) #data = SELF.REQUEST.RECV (1024) data = Self.rfile.readline () #read Data index = "001" #initialize print "Recv f Rom (%r):%r "% (self.client_aDdress,data) #print Data[4:7] #print "len=:", Len (data) error_buf = ' $DATA ' + Index + ', ' + ' Err ' + ' \ r \ n ' If len (data) = = 9:if Data[0] = = ' $ ' and data[7:9] = = ' \ r \ n ': index = data[4:7] If Index.isdigit (): If int (i Ndex) <= and int (index) >= 0:mutex.acquire () Sen D_buf = ' $DATA ' + index + ', ' + dict_ele[index] + ' \ r \ n ' #need protect Self.wfile.write (Send _BUF) print "Send_buf:", Send_buf mutex.release () Else:print "index including other char" Er Ror_buf = ' $DATA ' + index + ', ' + ' Err ' + ' \ r \ n ' self.wfile.write (ERROR_BUF) Else Print "index over" error_buf = ' $DATA ' + index + ', ' + ' Err ' + ' \ r \ n ' Self.wfile.write (ERROR_BUF) else:print "bit error!" Else:print "Recv error!" # print Self.request.threading.Thread.getName () # Sleep (5) Except:traceback.print _exc () def query_data (): Port_query = 6001 Addr_query = (host,port_query) Server = Threadingtcpserver ( Addr_query,query_data_requesthandle) Server.serve_forever () def main (): Recv_thread = Threading. Thread (target = recv_data_from_vehicle) Query_thread = Threading. Thread (target = query_data) Recv_thread.start () Query_thread.start () if __name__ = = "__main__": Main ()
Python Multi-threaded server