標籤:str print server status inpu 回調 服務端 地址 exec
使用SocketServer建立一個網路服務程式,並且是多線程的,只需要幾個簡單的步驟:
(1)、建立處理request的類,建立方法為:繼承BaseRequestHandler類,並重載handle()方法。該方法將被回調用做處理當前接收到的request。
注意:一般的做法是直接繼承StreamRequestHandler或者DatagramRequestHandler。比如:
class MyTCPHandler(SocketServer.StreamRequestHandler):
(2)、執行個體化一個server基類(比如TCPServer)的對象,並發伺服器位址和處理request的類作為參數傳入。
(3)、使用server基類對象調用handle_request()或serve_forever()方法,即可處理一個或多個request。
參考alex教程上的,伺服器端多線程方式監聽,接收從用戶端發送過來的命令cmd,執行cmd之後,將結果返回給用戶端看。代碼如下:
服務端代碼,multithread_server.py:
1 import SocketServer 2 import commands,time 3 class MyTCPHandler(SocketServer.BaseRequestHandler): 4 def handle(self): 5 while True: 6 print "Got a new connection from ",self.client_address 7 cmd = self.request.recv(1024) 8 if not cmd: 9 print "Lost connection with",self.client_address10 break11 print ‘recv:‘,cmd12 13 #commands.getstatusoutput execute cmd from client14 15 cmd_result = commands.getstatusoutput(cmd)16 17 18 #伺服器發送的結果的長度19 self.request.send(str(len(cmd_result[1]))) #cmd_result[0] result status, cmd_result[1] result content20 21 #為防止粘包現象,sleep一下22 time.sleep(0.2)23 24 #伺服器發送結果的內容25 self.request.sendall(cmd_result[1])26 27 if __name__ == "__main__":28 HOST,PORT = "localhost",99929 30 server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)31 server.serve_forever()32
用戶端代碼client.py
1 import socket 2 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 3 sock.connect((‘localhost‘,999)) 4 5 def recv_all(obj,msg_length): 6 raw_result = ‘‘ 7 while True: 8 if msg_length <=4096: 9 #data = once received10 data = obj.recv(msg_length)11 raw_result += data 12 break13 else:14 data = obj.recv(4096)15 raw_result += data16 msg_length = msg_length - 409617 18 return raw_result19 20 21 while True:22 user_input = raw_input("msg to send:").strip()23 24 sock.send(user_input)25 26 #res_size :接收到的結果長度27 res_size = int(sock.recv(1024))28 29 print ‘received data size: ‘,res_size30 31 #recv_all(sock,res_size): 接收到的結果內容32 print "received data::",recv_all(sock,res_size)33 34 sock.close()
python socket 實現簡單client與server