很简单的来说,我们在使用socket编程时,socket.send()函数中参数要求是‘bytes’类型的,那么我们在需要传输非‘bytes’类型的数据怎么办?
有人会说,用encode对其进行编码,再不济使用bytes()进行强制类型转换。当然这对于python的基本数据类型是完全可行的,因为在接收端也会有这种数据类型,只要将其转换回来即可。那么要是接收端没有你的这种数据类型该怎么办呢?又或者你这个数据类型是自定义的,根本就没有encode和decode方法又该如何是好呢?
就到了pickle模块闪亮登场的时候了。pickle能够针对socket传输自定义类或者其他数据类型的时候使用,在接收端也能通过pickle模块将接收到的数据解封,这样就形成了一个很好的传输方式,不需要破坏传输的包,编码来解码去,头都要爆炸。
接下来看一个我写的一个例子,我将这个例子上传到这个地址:https://download.csdn.net/download/liyihao17/10841668
import pickle
import socket
PORT = 4396
ADDR = '127.0.0.1'
class Animal:
def __init__(self, action):
self.action = action
type = input('Please input server or client : ')
if type == 'server':
ConnectSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ConnectSock.bind((ADDR, PORT))
ConnectSock.listen(5)
print('listening...')
ServerSock, addr = ConnectSock.accept()
recv_message = ServerSock.recv(1024)
print(pickle.loads(recv_message).action)
ServerSock.close()
ConnectSock.close()
elif type == 'client':
ClientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ClientSock.connect((ADDR, PORT))
a = Animal('hahahaha123123')
ClientSock.send(pickle.dumps(a))
ClientSock.close()
这个例子就很好地说明了pickle模块的作用。
1、首先我在文件头部定义了一个Animal类,然后它有一个属性叫做‘action’
2、然后判断是服务器端还是客户端,这里默认服务器端是接收方,客户端是发送方
3、客户端想要发送一个实例化的Animal类(即对象a)
(1)使用pickle.dumps()函数将a封装
(2)使用socket.send()函数将封装好的message发送出去
4、服务器端接收到报文,使用pickle.loads解封装,得到了对象a,然后在屏幕上打印出a.action(即hahahaha123123)
1、先将服务器端开启
2、然后开启客户端,客户端会自动发送封装好的对象a
3、查看服务器端的内容
服务器端将hahahaha123123打印在了屏幕上,即可说明pickle确实将这个类封装,并通过socket.send()函数传递过来了,需要记住的是pickle不仅仅是类,其他很多的数据类型都能够封装,不管是python原生的还是自定义的都能够封装,所以在使用socket编程的时候可以好好使用这个模块。