废话不多说,服务器是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() # 永远,就是通信循环(链接循环)