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端的运行结果: