在看《Python核心程式設計》第三版 講述網絡程式設計Socket的知識,在練習中采用Python 3 的代碼中遇到一個與編碼解碼有關的坑,本文将給予詳細的介紹。
Python: 3.6.0
庫: socket
仿照書中的代碼(中文版 55-56頁) 加上自己的一點改動在我的環境中不能運作,總是報這個錯誤:TypeError: a bytes-like object is required, not 'str'
這裡是我的用戶端Socket代碼
我的環境是: Python 3.6.0, 怎麼破?
錯誤的位置是在代碼clientSocket.send(data)部分,但是翻看python socket .send()源代碼_socket.py 方法說明
<code>def send(self, data, flags=None): # real signature unknown; restored from __doc__</code>
這個send方法的參數期望的是一個 "a data string" 啊,而我确實給了一個string。
官方對Socket的說明:
<code>socket.send(bytes[, flags])</code>
可以看到在Python 3中send()方法期望的是一個bytes, 而不是str
看來我我前面看到的是假的源代碼參數的說明。哈哈。
解決錯誤的方法就是在調用send()方法之前對字元串類型資料進行encode,将字元串轉化成bytes
代碼如下:
<code>clientSocket.send(data.encode())</code>
與此同時,在服務端運作的時候也遇到了類似資料無法接收的問題。
如下代碼得到的data,是無法直接列印的。
data = clientSocket.recv(1024)
如果要列印data資料的話,也要調用decode()進而将資料從bytes轉化為str。
encode()編碼 : str -> bytes
decode()解碼 : bytes -> str
預設的encoding是 utf-8
更多内容見官方文檔:
<a href="https://docs.python.org/3/library/stdtypes.html?highlight=decode#str.encode">str.encode()</a>
<a href="https://docs.python.org/3/library/stdtypes.html?highlight=decode#bytes.decode">bytes.decode()</a>
服務端:
用戶端:
本文轉自 yuanzhitang 51CTO部落格,原文連結:http://blog.51cto.com/yuanzhitang/2060790,如需轉載請自行聯系原作者