使用Python的socketserver模块构造简单实用的数据传输服务器

废话不多说,服务器是TCP类型,使用末尾特征字节判断是否接收完数据,以下是服务端代码,客户端中的TCP传输数据要把末尾特征字节合并到要传送的数据尾部,便于服务器识别完整数据。

# 导入socketserver模块
import base64
import socketserver
class MyServer(socketserver.BaseRequestHandler): #定义一个类,该类必须继承socketserver下的BaseRequestHandler类
    def handle(self):  # 必须定义一个handle方法
        print('conn is ', self.request)  # self.request是获取的链接,相当于conn
        print('addr is ', self.client_address)  # self.client_address则是获取的地址,相当于addr
        data=bytearray()
        b=b'*w#o*' #自定义数据结尾标志,字节型
        d="*w#o*" #自定义数据结尾标志,字符串
        # 循环收发消息
        while True:
            data += self.request.recv(1024) #累加发来的数据
            while data.endswith(b)==True: #使用endswith()函数检查字节数组里是否有b'*w#o*'。
                total_data=data #这个多此一举的变量传递,可以不这么写
                print(len(total_data),'\n')
                image= base64.b64decode(total_data.decode().split(d)[0]) #把传递过来的图片base64编码解码,同时使用split(d)函数把图片的数据分割出来。
                with open('D:/image1.jpg','wb')as f: #写出图片文件
                    f.write(image)
                f.close()
                data.clear()
                total_data.clear()
                break

            try:  # 异常处理

            except Exception as e:
                print(e)  # 打印错误
                break

if __name__ == '__main__':
    # 多线程的TCP服务端,即可以同时开启多个链接运行,也就是多客户端并发效果;
    # 再将这样的功能实例化成一个对象s
    s = socketserver.ThreadingTCPServer(('10.20.20.17', 8713), MyServer)
    # 第一个参数为服务端的ip地址,用元组传进;第二个参数是刚刚定义的那个类
    s.serve_forever()  # 永远,就是通信循环(链接循环)
  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值