Python网络编程(四)-socket编程,发生“TypeError: a bytes-like object is required, not ‘str“错误以及解决方式

1. Python socket简介:

和其它编程语言一样,python也支持socket套接字。

需要注意的是,在python3版本进行数据发送和接收时,需要用字节流。否则会出现“TypeError: a bytes-like object is required, not 'str”错误。

本例程就出现这样的问题了。

2. Python socket实践:

问题描述:

在使用python socket进行网络编程时,出现“TypeError: a bytes-like object is required, not 'str”错误。
(我使用的版本是Python 3.8.2)。

问题分析:
这是因为在进行网络传输时,需要用byte类型来进行网络传输,而不是str类型。

解决方法:
在server端,用encode(),  在client端,用decode()进行字符串和字节的转换,具体代码如下:
 

详细代码:

(1)服务端代码:socket_server.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 功能:服务端代码 
# 文件名:socket_server.py
import os,sys
import socket               # 导入 socket 模块

#创建socket和监听端口
def test_socket_server(): 
    s = socket.socket()         # 创建 socket实例
    host = socket.gethostname() # 获取本地主机名
    port = 6000                 # 设置端口
    s.bind((host, port))        # 绑定端口
    
    print('server listen 6000...')
    s.listen(5)                 # TCP监听,等待客户端连接
    
    while True:
        c,addr = s.accept()     # 接受TCP连接,并返回新的套接字与IP地址
        print(addr)
        str='hello python!'
        str=str.encode()        #必须用它进行转换
        c.send(str)
        c.close()               # 关闭连接

#main
if __name__ == '__main__':
    test_socket_server()
    

(2)客户端代码: socket_client.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 功能:客户端代码
# 文件名:socket_client.py

import os,sys
import socket               # 导入 socket 模块

def test_client():
	s = socket.socket()          #创建 socket 实例
	host = socket.gethostname()  #获取本地主机名
	port = 6000                  #设置端口号
	 
	s.connect((host, port))      #连接
	recv_data=s.recv(1024)       #接收数据
	recv_data=recv_data.decode() #必须用它进行转换
	print(recv_data)
	s.close()                    #关闭连接

#main
if __name__ == '__main__':
    test_client()
    

运行结果:

Server端的运行结果:

Client端的运行结果:

猜你喜欢

转载自blog.csdn.net/liranke/article/details/113882250