【python】pickle模块在socket编程中的使用

一、需求分析

很简单的来说,我们在使用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编程的时候可以好好使用这个模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值