Python 3.X 与 2.X 的恩怨情仇 (一)

时间:2020-12-22 18:17:07

Python 3.X 与 2.X 的恩怨情仇 (一)

闲来用python socket写了一对简单的服务端与客户端
三下五除二的搞定后,兴高采烈的开始尝试
熟练的打开CMD 敲下python Client.py和python Server.py
Python 3.X 与 2.X 的恩怨情仇 (一)
这似曾相识的错误 到底是什么呀喂!!!
于是查看代码
Client.py

import socket

s = socket.socket()
host = socket.gethostname()
port = 1234

s.connect((host,port))
print(s.recv(1024))
s.close()

Server.py

import socket

s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host,port))

s.listen(5)
while True:
c, addr = s.accept()
print('链接地址:',addr)
c.send('Welcom!!')
c.close()

根据错误的提示我们锁定Serve.py的第14行:
c.send('Welcom!!')
怎么看都不像错的啊喂!!!

去求助万能度娘发现:
can’t use a string pattern on a bytes-like object的原因是:

3.x现在的参数更改了,现在读取的是bytes-like的,但参数要求是chart-like的。

解决方法:
1. 在str前面加一个小b,表示要操作的对象是bytes型。
2. bytes(str,encoding=”utf-8”)
总而言之就是要将str类型的对象转换为bytes类型
c.send(b'welcome!!!')
c.send(bytes('welcome!!!',encoding="utf-8"))

这两种修改方式都可以让服务端成功发送数据
客户端成功接收
Python 3.X 与 2.X 的恩怨情仇 (一)

socket.send()的输入参数是需要bytes,在python2.x中支持str,所以在我们使用3.x平台时候需要将其转化为bytes