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()
server

 

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()
client

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()
server
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()
client
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()
client

 

黏包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()
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)
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()
client 发三次 第三次包含了长度

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()
server 字典类型

 

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}
# 再发文件内容
client

 

 

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的主要内容,如果未能解决你的问题,请参考以下文章

算法手撕代码111~120

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

编写高质量代码改善C#程序的157个建议——建议111:避免双向耦合