天天看點

Python3.X Socket 一個編碼與解碼的坑

在看《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 -&gt; bytes

decode()解碼 : bytes -&gt; 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,如需轉載請自行聯系原作者