python學習筆記(socket模組)

來源:互聯網
上載者:User

標籤:strip   服務端   主機   int   time   read   sub   alt   auc   

1、socket模組使用要分為服務端及用戶端,服務端用於接收並處理請求,然後把請求資料回傳回到用戶端,用戶端用於讀取資料、關閉串連、最後結束互動

2、服務端socket模組使用步驟:

      

 1 import socket 2  3 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 4 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  # 5 phone.bind((‘127.0.0.1‘,8080))    #綁定(主機,連接埠號碼)到通訊端 6  7 phone.listen(5)    #開始TCP監聽 8  9 conn,client_addr=phone.accept()  #被動接受TCP客戶的串連,(阻塞式)等待串連的到來10 11 client_data=conn.recv(1024)   # 接收TCP資料 最大1024位元組12 conn.send(client_data.upper())   #發送TCP資料13 14 15 conn.close()     #關閉TCPl串連16 17 phone.close()    #關閉通訊端
View Code

3、用戶端socket模組使用步驟:

 1 import socket 2  3 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 4 phone.connect((‘127.0.0.1‘,8080))   #串連服務端的ip+port 5  6  7 msg=input(‘>>:‘).strip() 8  9 phone.send(msg.encode(‘utf-8‘))   #向服務端發送資訊10 server_data=phone.recv(1024)     #接收服務端的資訊11 12 13 phone.close()   #關閉串連
View Code

4、socket模組是基於TCP或UDP協議實現的,由於TCP協議是流式資料,所以基於tcp協議的socket會出現粘包現象,解決粘包現象需要使用  struct模組。

      struct模組的用途:把一個類型,如數字,轉成固定長度的bytes

                   使用方法:a=struct.pack(‘i‘,123123123123)   # 將123123123123裝換成4個bytes長度;

                                    stauct.unpack(‘i‘,a)[0]     #提取123123123123

         詳細類型轉換

        

    處理粘包問題:

          我們可以把前序做成字典,字典裡包含將要發送的真實資料的詳細資料,然後json序列化,然後用struck將序列化後的資料長度打包成4個位元組(4個自己足夠用了)

         發送時:先發前序長度

                      再編碼前序內容然後發送

                      最後發真實內容

         接收時:先手前序長度,用struct取出來

                       根據取出的長度收取前序內容,然後解碼,還原序列化

                       從還原序列化的結果中取出待取資料的詳細資料,然後去取真實的資料內容

   

 1 import socket,struct,json 2 import subprocess 3 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 4 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加 5  6 phone.bind((‘127.0.0.1‘,8080)) 7  8 phone.listen(5) 9 10 while True:11     conn,addr=phone.accept()12     while True:13         cmd=conn.recv(1024)14         if not cmd:break15         print(‘cmd: %s‘ %cmd)16 17         res=subprocess.Popen(cmd.decode(‘utf-8‘),18                              shell=True,19                              stdout=subprocess.PIPE,20                              stderr=subprocess.PIPE)21         err=res.stderr.read()22         print(err)23         if err:24             back_msg=err25         else:26             back_msg=res.stdout.read()27 28 29         conn.send(struct.pack(‘i‘,len(back_msg))) #先發back_msg的長度30         conn.sendall(back_msg) #在發真實的內容31 32     conn.close()33 34 服務端(自定製前序)
服務端代碼
 1 #_*_coding:utf-8_*_ 2 import socket,time,struct 3  4 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 5 res=s.connect_ex((‘127.0.0.1‘,8080)) 6  7 while True: 8     msg=input(‘>>: ‘).strip() 9     if len(msg) == 0:continue10     if msg == ‘quit‘:break11 12     s.send(msg.encode(‘utf-8‘))13 14 15 16     l=s.recv(4)17     x=struct.unpack(‘i‘,l)[0]18     print(type(x),x)19     # print(struct.unpack(‘I‘,l))20     r_s=021     data=b‘‘22     while r_s < x:23         r_d=s.recv(1024)24         data+=r_d25         r_s+=len(r_d)26 27     # print(data.decode(‘utf-8‘))28     print(data.decode(‘gbk‘)) #windows預設gbk編碼29 30 用戶端(自定製前序)
用戶端代碼

 

  

python學習筆記(socket模組)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.