陈德铭去向,三明招聘网,初中语文网
# server端负责接收 import socket import json sk = socket.socket() sk.bind(('127.0.0.1', 5002)) sk.listen() conn, addr = sk.accept() msg_f = conn.recv(1024).decode('utf-8')# 接收client端的文件信息 dic_f = json.loads(msg_f)# json.loads()用于将字符串形式的数据转化为字典 with open(dic_f['filename'], mode='wb') as f: file = conn.recv(dic_f['filesize'])# 以发送过来的文件大小接收文件 f.write(file) conn.close() sk.close() ############################################## # client端负责发送 import socket import os import json sk = socket.socket() sk.connect(('127.0.0.1', 5002)) abs_path = r'd:\1.jpg' filename = os.path.basename(abs_path) filesize = os.path.getsize(abs_path) dic = {'filename': filename, 'filesize': filesize} str_dic = json.dumps(dic)# json.dumps()用于将字典形式的数据转化为字符串 sk.send(str_dic.encode('utf-8'))# 将文件信息传递给server端 with open(abs_path, mode='rb') as f: file = f.read() sk.send(file) sk.close()
# 负责接收 import socket import json import struct sk = socket.socket() sk.bind(('127.0.0.1', 5002)) sk.listen() conn, addr = sk.accept() lens = conn.recv(4) lens = struct.unpack('i', lens)[0] msg_f = conn.recv(lens).decode('utf-8')# 接收client端的文件信息 dic_f = json.loads(msg_f)# json.loads()用于将字符串形式的数据转化为字典 with open(dic_f['filename'], mode='wb') as f: while dic_f['filesize'] > 0: file = conn.recv(1024) dic_f['filesize'] -= len(file) f.write(file) conn.close() sk.close() ############################################################ # 负责发送 import socket import os import json import struct sk = socket.socket() sk.connect(('127.0.0.1', 5002)) abs_path = r'c:\users\lenovo\pictures\camera roll\win_20200301_14_36_34_pro.mp4' filename = os.path.basename(abs_path) filesize = os.path.getsize(abs_path) dic = {'filename': filename, 'filesize': filesize} str_dic = json.dumps(dic)# json.dumps()用于将字典形式的数据转化为字符串 # 为了避免粘包现象 b_dic = str_dic.encode('utf-8') lens = struct.pack('i', len(b_dic))# 将要传输的文件信息的长度转化为4字节的形式 sk.send(lens) sk.send(b_dic)# 将文件信息传递给server端 with open(abs_path, mode='rb') as f: # 传输大文件用循环读取 while filesize > 0: file = f.read(1024)# 每次读取1024字节 filesize -= 1024 sk.send(file) sk.close()
:通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。即通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
# server端 import socket import os import hashlib import hmac key = b'password' msg_rand = os.urandom(16)# 生成16位类型bytes的随机信息 sk = socket.socket() sk.bind(('127.0.0.1', 5002)) sk.listen() conn, addr = sk.accept() conn.send(msg_rand)# 发送16位随机信息 # 根据随机信息和密钥进行摘要 ''' # 采用hashlib模块中的md5,也可以用sha1 md5 = hashlib.md5(key) md5.update(msg_rand) res = md5.hexdigest().encode('utf-8')# 摘要结果为str类型 ''' # 采用hmac模块 hm = hmac.new(key, msg_rand) res = hm.digest()# 此时摘要结果为bytes类型 msg_res = conn.recv(32) if res == msg_res: print('合法客户端') conn.send(b'hello') else: conn.close() sk.close() ######################################################## # client端 import socket import hashlib import hmac key = b'password' sk = socket.socket() sk.connect(('127.0.0.1', 5002)) msg_rand = sk.recv(16)# 接收随机信息 ''' md5 = hashlib.md5(key) md5.update(msg_rand) res = md5.hexdigest().encode('utf-8') ''' hm = hmac.new(key, msg_rand) res = hm.digest() sk.send(res) msg = sk.recv(1024) print(msg) sk.close()
socketsever模块基于socket模块。
常用于tcp协议的sever端处理并发的客户请求。
此时多个client可与sever端通信。
# sever端 import time import socketserver class mysever(socketserver.baserequesthandler): def handle(self): conn = self.request while true: # 小循环可发多次消息 try: msg_r = conn.recv(1024).decode('utf-8') conn.send(msg_r.upper().encode('utf-8')) time.sleep(0.5) except connectionreseterror: break sever = socketserver.threadingtcpserver(('127.0.0.1',5002), mysever) sever.serve_forever()# sever端不主动退出 ###################################################################### # client-n端 import time import socket sk = socket.socket() sk.connect(('127.0.0.1', 5002)) while true: sk.send(b'hello') msg = sk.recv(1024).decode('utf-8') print(msg)
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论