天天看点

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,如需转载请自行联系原作者