python socket 實現簡單client與server

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.