关于 python3 Socket.send bytes-Obj 问题

在翻阅学习《python核心编程 第三版》 的过程中,在敲书中代码时, 发现server端一直报错:

a bytes-like object is required, not ‘str’

查询关键词时, 看到一个博客做出了一些解释

调整代码如下:

server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# -*- coding: utf-8 -*-
# python3

# author:
# time:
#

# 判断版本使用print

from __future__ import print_function
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime


# 继承处理类,并实现处理函数
class MyRequestHandle(SRH):
# 实现处理函数
def handle(self):
print('...connected from:', self.client_address)

# 因为python3的 socket send 只发送 bytes 则 recv也仅为bytes
strData = self.rfile.readline()
#strData = self.request.recv(1024).strip()


# 查看收到数据的类型 ,并转换类型
print(type(strData))
if isinstance(strData, bytes):
strData = strData.decode('utf-8')

# print(type(strData))
# print(strData)
# print(type(strC))
# print(strC)

# 如果接收的不是Str类型, 则返回默认字符串
if not isinstance(strData, str):
strData = "Server Recv String Error!"

self.wfile.write(bytes('[%s] %s' % (ctime(), strData), 'utf-8'))

def main():
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)

# 实例一个TCP Socket对象, 并设置 目标 和 处理对象
tcpServ = TCP(ADDR, MyRequestHandle)
print("Waiting for Connecting...")

# 启动服务器循环
tcpServ.serve_forever()


if __name__ == "__main__":
main()

client:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding: utf-8 -*-
# python3

# author:
# time:
#

# 判断版本使用print

from __future__ import print_function
import socket
#from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime


def main():
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

while True:
tcpClientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpClientSocket.connect(ADDR)
data = input('>')
if not data:
break
print(type(data))

# python3中 send函数 仅接收 bytes类型的数据, 所以发送之前需要转换
tcpClientSocket.send(bytes('%s\r\n' % data, 'utf-8'))
data = tcpClientSocket.recv(BUFSIZ)
if not data:
break
print(data.strip().decode('utf-8'))
tcpClientSocket.close()


if __name__ == "__main__":
main()

目前对 strbytesdecodeencode还不是太理解

插入一张图片作为说明:
python3_str

文章目录
|