111
Posted learnacode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了111相关的知识,希望对你有一定的参考价值。
# 1 .黏包现象 发送的两个数据黏在一起 #2 .成因 #发送端粘:和包机制 #接受端粘 :接受不及时 #数据与数据是无边界的流逝传输 # 3解决黏包 #自定义协议 #struct模块 #把任意长度的数据变成固定的4个字节 #低级 #先发送数据长度 #在发送数据 #高级 #先把所有相发送的数据信息放在字典 #发送字典的长度 #发送字典 #发送设计的数据 #作业 #1 默写 黏包协议 #2 上传大文件 视频 文件 图片 # 4个g #3 和你同桌 调通从你的计算机上传一个视频到你同桌电脑 #4 进阶 : 带上登录 先登录 在上传
登录:
import sys import json import socket import hashlib def get_md5(username,password): md5 = hashlib.md5(username.encode(\'utf-8\')) md5.update(password.encode(\'utf-8\')) return md5.hexdigest() def login(dic_msg): print(dic_msg[\'user\'], dic_msg[\'pwd\']) with open(\'userinfo\', encoding=\'utf-8\') as f: for line in f: user, pwd = line.strip().split(\'|\') print(pwd,get_md5(dic_msg[\'user\'], dic_msg[\'pwd\'])) if user == dic_msg[\'user\'] and pwd == get_md5(dic_msg[\'user\'], dic_msg[\'pwd\']): return {\'opt\':\'login\',\'result\':True} else:return {\'opt\':\'login\',\'result\':False} sk= socket.socket() sk.bind((\'127.0.0.1\',9001)) sk.listen() while True: conn,addr = sk.accept() msg = conn.recv(1024).decode(\'utf-8\') dic_msg = json.loads(msg) if hasattr(sys.modules[__name__],dic_msg[\'operate\']): ret = getattr(sys.modules[__name__],dic_msg[\'operate\'])(dic_msg) content = json.dumps(ret).encode(\'utf-8\') conn.send(content) conn.close() sk.close()
import json import socket import hashlib def get_md5(username,password): md5 = hashlib.md5(username[::2].encode(\'utf-8\')) md5.update(password.encode(\'utf-8\')) return md5.hexdigest() username = input(\'用户名 :\') password = input(\'密 码 :\') sk = socket.socket() sk.connect((\'127.0.0.1\',9001)) msg = {\'operate\':\'login\', \'user\':username, \'pwd\':get_md5(username,password)} str_msg = json.dumps(msg) sk.send(str_msg.encode(\'utf-8\')) content = sk.recv(1024) str_content = content.decode(\'utf-8\') dic_content = json.loads(str_content) if dic_content[\'result\']: print(\'登录成功\') else: print(\'登录失败\') sk.close()
usrinfo:
alex|ee838c58e5bb3c9e687065edd0ec454f
一对多聊天:
import json import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind((\'127.0.0.1\',9001)) user_info = { 1234:(\'alex\',\'\\033[1;32m\'), 5678:(\'宝元\',\'\\033[1;31m\'), } while True: msg,addr = sk.recvfrom(1024) str_msg = msg.decode(\'utf-8\') dic_msg = json.loads(str_msg) code = dic_msg[\'code\'] content = dic_msg[\'msg\'] print(\'%s%s : %s\\033[0m\'%(user_info[code][1],user_info[code][0],content)) ret = input(\'>>>\').encode(\'utf-8\') sk.sendto(ret,addr) sk.close()
import json import socket sk = socket.socket(type=socket.SOCK_DGRAM) addr = (\'127.0.0.1\',9001) code = 5678 while True: msg = input(\'>>>\') if msg.upper() == \'Q\': break send_msg = {\'code\':code,\'msg\':msg} str_msg = json.dumps(send_msg) sk.sendto(str_msg.encode(\'utf-8\'),addr) ret = sk.recv(1024).decode(\'utf-8\') if ret.upper() == \'Q\': break print(ret) sk.close()
import json import socket sk = socket.socket(type=socket.SOCK_DGRAM) addr = (\'127.0.0.1\',9001) code = 1234 while True: msg = input(\'>>>\') if msg.upper() == \'Q\':break send_msg = {\'code\':code,\'msg\':msg} str_msg = json.dumps(send_msg) sk.sendto(str_msg.encode(\'utf-8\'),addr) ret = sk.recv(1024).decode(\'utf-8\') if ret.upper() == \'Q\':break print(ret) sk.close()
黏包server
import struct import socket sk = socket.socket() sk.bind((\'127.0.0.1\',9001)) sk.listen() conn,addr = sk.accept() num = conn.recv(4) num = struct.unpack(\'i\',num)[0] file_name = conn.recv(num).decode(\'utf-8\') filesize = conn.recv(4) filesize = struct.unpack(\'i\',filesize)[0] with open(file_name,\'wb\') as f: content = conn.recv(filesize) f.write(content) conn.close() sk.cl
import struct import socket sk = socket.socket() sk.bind((\'127.0.0.1\',9001)) sk.listen() conn,addr = sk.accept() num = conn.recv(4) print(num) #b\'\\x0b\\x00\\x00\\x00\' num = struct.unpack(\'i\',num)[0] #元组第一个元素 后面的是点 # num1 = struct.unpack(\'i\',num)[1] #元组第一个元素 后面的是点 print(num) #11 # print(num1) file_name = conn.recv(num).decode(\'utf-8\') print(file_name)#2.作业.py filesize = conn.recv(4) print(filesize)#b\'H\\x01\\x00\\x00\' filesize = struct.unpack(\'i\',filesize)[0] print(filesize)#328 with open(file_name,\'wb\') as f: content = conn.recv(filesize) f.write(content) conn.close() sk.close()
import struct import socket sk = socket.socket() sk.bind((\'127.0.0.1\',9001)) sk.listen() conn,addr = sk.accept() num = conn.recv(4) print(num) #b\'\\x0b\\x00\\x00\\x00\' num = struct.unpack(\'i\',num)[0] #元组第一个元素 后面的是点 # num1 = struct.unpack(\'i\',num)[1] #元组第一个元素 后面的是点 print(num) #11 # print(num1) file_name = conn.recv(num).decode(\'utf-8\') print(file_name)#2.作业.py filesize = conn.recv(4) print(filesize)#b\'H\\x01\\x00\\x00\' filesize = struct.unpack(\'i\',filesize)[0] print(filesize)#328 with open(file_name,\'wb\') as f: content = conn.recv(filesize) f.write(content) conn.close() sk.close()
str 字符串 字节bytes dumps 倾倒 load 装入
a = \'中文\'.encode(\'utf-8\')#encode 一下就是bytes 类型的 print(a,type(a))#b\'\\xe4\\xb8\\xad\\xe6\\x96\\x87\' <class \'bytes\'> b = a.decode(\'utf-8\') #decode 一下就是str类型的 print(b,type(b)) #中文 <class \'str\'> # dunps#倾倒 load#装入 a = {\'1\':2,\'2\':3} import json b = json.dumps(a) #倾倒乱糟糟一个\'\' print(b,type(b))#{"1": 2, "2": 3} <class \'str\'> c = json.loads(b) #装入有规律的字典 print(c,type(c))#{\'1\': 2, \'2\': 3} <class \'dict\'>
send 发送 必须是bytes b\'\' 和 i.encode(\'utf-8\') 接受解码 成字符串 decode
字典类型
import json import struct import socket sk = socket.socket() sk.bind((\'127.0.0.1\',9001)) sk.listen() conn,addr = sk.accept() num = conn.recv(4) num = struct.unpack(\'i\',num)[0] str_dic = conn.recv(num).decode(\'utf-8\') dic = json.loads(str_dic) with open(dic[\'filename\'],\'wb\') as f: content = conn.recv(dic[\'filesize\']) f.write(content) conn.close() sk.close()
import os import json import struct import socket sk = socket.socket() sk.connect((\'127.0.0.1\',9001)) filepath = input(\'请输入文件路径 :\') filename = os.path.basename(filepath) filesize = os.path.getsize(filepath) dic = {\'filename\':filename,\'filesize\':filesize} str_dic = json.dumps(dic) bytes_dic = str_dic.encode(\'utf-8\') len_dic = len(bytes_dic) bytes_len = struct.pack(\'i\',len_dic) sk.send(bytes_len) sk.send(bytes_dic) with open(filepath,\'rb\') as f: content = f.read() sk.send(content) sk.close() # 先发送字典的长度 # 再发字典 {\'filename\':xxxx,\'filesize\':xxxxx} # 再发文件内容
import json import struct import socket sk = socket.socket() sk.bind((\'127.0.0.1\',9001)) sk.listen() conn,addr = sk.accept() num = conn.recv(4) num = struct.unpack(\'i\', num)[0] str_dic = conn.recv(num).decode(\'utf-8\') dic = json.loads(str_dic) with open(dic[\'filename\'],\'wb\') as f: content = conn.recv(dic[\'filesize\']) f.write(content) conn.close() sk.close()
以上是关于111的主要内容,如果未能解决你的问题,请参考以下文章