作业

#__author : 'liuyang'
#date : 2019/4/11 0011 下午 12:36
# 这两天 1.软件开发规范 不写 没法做新作业
#2. 认证+上传 +下载 + 校验文件的一致性
# 3. socketserver 实现一个并发的上传
# 4. 选做: #进度条
# 5.默写 并发的socketserver
# 内置函数 print
import time
for i in range(0,101,2):
time.sleep(0.1)
char_num = i//2 #打印多少个'*'
per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num)
print(per_str,end='', flush=True)
#小越越 : \r 可以把光标移动到行首但不换行 # 打印进度条

sock的其它方法

#__author : 'liuyang'
#date : 2019/4/11 0011 下午 12:20
# 没来得及 关闭 报错导致 conn.close() 和 sk.close()
#端口没被占用 其实已经被占用了
# sk.bind(()) # 申请了一个资源 向操作系统
'''
import socket
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSERADDR,1)
#防止程序因为意外退出之后程序出现端口 被占用的错
#生产环境上不大用 不允许报错 不能另人占你端口 sk.bind(('127.0.0.1',9001))
sk.listen()
# 其他代码
sk.close()
'''
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.setblocking(False) #blocking 阻塞 设置 不设置默认阻塞
# 非阻塞 #输入什么的没法非阻塞
sk.listen() conn_l = []
while True:
try :
conn,addr = sk.accept()
# conn.recv() #也不阻塞了 网络框架都用非阻塞 阻塞效率太低
conn_l.append(conn)
except BlockingIOError:
for conn in conn_l:
try:
msg = conn.recv(1024).decode('utf-8')
print(msg)
conn.send(msg.upper().encode('utf-8'))
except BlockingIOError:
pass
# sk.accept()
# 不阻塞 conn1 不说话 去问 conn2 tcp的1对多

server

import socket

sk = socket.socket()
sk.connect(('127.0.0.1',9001)) while True:
sk.send(b'hello')
ret = sk.recv(1024)
print(ret)

client 1 and 2

实现了tcp的一对多  不阻塞 input 不行

import os
import socket
import hmac
secret_key= b'liuyang'
ret = os.urandom(32) #给每一个客户端发送一个随机的字符串,来保证即使数据被拦截你也不能使用这个信息
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
conn,addr = sk.accept()
conn.send(ret) hmac = hmac.new(secret_key,os.urandom(32))
print(hmac.digest())
ret = conn.recv(1024) if ret == hmac.digest():
print('是')
else:
print('不适')

错误的hmac server

#__author : 'liuyang'
#date : 2019/4/11 0011 下午 12:07
#__author : 'liuyang'
#date : 2019/4/11 0011 下午 12:02
import socket
import hmac
import os
sercet_key = b'liuyang'
sk = socket.socket()
sk.connect(('127.0.0.1',9000)) rand = sk.recv(32)
hmac = hmac.new(sercet_key,os.urandom(32))
print(hmac.digest())
# sk.send(res1.encode('utf-8'))
sk.send(hmac.digest())
# hmac.digest()
sk.close()

client

正确

import os
import hashlib
import socket secret_key = b'alex sb'
#os.urandom(32) 给每一客户端发送一个随机的字符串,来保证即使数据被拦截你也不能使用这个消息
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen() conn,addr = sk.accept()
rand = os.urandom(32)
conn.send(rand) sha = hashlib.sha1(secret_key)
sha.update(rand)
res = sha.hexdigest() ret = conn.recv(1024).decode('utf-8')
if ret == res:
print('是合法的客户端')
else:
print('不是合法的客户端')
conn.close()

server

import socket
import hashlib secret_key = b'alexsb'
sk = socket.socket()
sk.connect(('127.0.0.1',9001)) rand = sk.recv(32) sha = hashlib.sha1(secret_key)
sha.update(rand)
res = sha.hexdigest() sk.send(res.encode('utf-8')) sk.close()

client

hmac模块

import os
import hmac hmac = hmac.new(b'alex sb',os.urandom(32))
print(hmac.digest())

自动字节

为什么验证客户端 的合法性

#__author : 'liuyang'
#date : 2019/4/11 0011 上午 11:20
# http # 登录博客园 用户名 明文(不安全)或者密文(小网站舍不得花钱)
# https #发送用户名密码之后 内置特殊加密手段 # 防数据拦截 网安 # import socketserver
# class Manager(socketserver.BaseRequestHandler):
# def hander(self):
# conn = self.request
# print(conn)
# socketserver.ThreadingTCPServer((),Manager)
# socke # 各个分校 向北京(客户端吗)推送招生信息 每晚12点
# 劫持的人 获得了北京的ip 地址 扫端口
# ip + port(循环或者猜) 别人给你发了不好的信息
# 多个用同一个认真协定 多个登录的话太麻烦 # 不适一个面向用户的,需要用户自己输入用户名和密码的
# 而是面向一台server 的所有的(500台)
# 都是以一种我们共同的方式来进行一个验证 # server 端 密钥key: 客户端知道
#生成随机的字符串 发给他 gdgadsgas #通过特殊的算法得到一个结果
#再生成随机的字符串 发给他 dgadgasdg
# 密钥+ 随机的字符串 通过特殊的算法得到一个结果 比对
# 密钥+ 随机+特殊算法 难破解
#__author : 'liuyang'
#date : 2019/4/11 0011 上午 11:55
import os
import hashlib
import socket
secret_key= b'liuyang'
ret = os.urandom(32) #给每一个客户端发送一个随机的字符串,来保证即使数据被拦截你也不能使用这个信息
print(ret)#b'lK\x12\xb4\xabc\xd92Q%\xd5\x05\x0fz\xf2cg\xb8b\x0c?\xf13\xf3\x92:\x91\x00\x079\xdf\x9d'
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
conn,addr = sk.accept()
conn.send(ret) sha = hashlib.sha1(secret_key)
sha.update(ret)
res1 = sha.hexdigest()
ret = conn.recv(1024).decode('utf-8') if ret == res1:
print('是')
else:
print('不适')

md5 版本的 server

#__author : 'liuyang'
#date : 2019/4/11 0011 下午 12:02
import socket
import hashlib
sercet_key = b'liuyang'
sk = socket.socket()
sk.connect(('127.0.0.1',9000)) rand = sk.recv(32)
sha = hashlib.sha1(sercet_key)
sha.update(rand)
res1 = sha.hexdigest()
sk.send(res1.encode('utf-8')) sk.close()

并发

#__author : 'liuyang'
#date : 2019/4/11 0011 上午 10:40
# while True conn.close()
# 一个连 另一个不能连
import socketserver #原生socket(底层)的 上层
#socketserver(底层)模块
#socketserver网络连接这个操作是socket模块实现的
import time
# 同时接受多个 所有有写了一个 还有太多了
class Myserver(socketserver.BaseRequestHandler):
def handle(self): #必须继承这个类 重写方法两个不可改 类名可改
conn = self.request #这个就是conn 只要有人连 执行handle
for i in range(200):
# print(self.request)
conn.send(('hello%s'%i).encode('utf-8')) msg = conn.recv(1023)
print(msg)
time.sleep(0.5)
server = socketserver.ThreadingTCPServer(('127.0.0.1',9001),Myserver) #t现成
server.serve_forever()
'''
server 端给每一个client 提供相同的服务''' # 实例化 socket 去绑定端口listen ThreadingTCPServer
# accept server.serve_forever() 做的 # self.handle() 执行子类的 没有 init 执行init 的 里面有self.handle()
# 没有self.handle1() 所以不能改handle() #源码里经常遇到
# 源码很混乱

server

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9001)) while True:
msg = sk.recv(1024)
print(msg)
sk.send(msg)
sk.close()

client

import socketserver     #原生socket(底层)的 上层
import time
class Myserver(socketserver.BaseRequestHandler):
def handle(self): #必须继承这个类 重写方法两个不可改 类名可改
conn = self.request #这个就是conn 只要有人连 执行handle
for i in range(200):
conn.send(('hello%s'%i).encode('utf-8')) msg = conn.recv(1023)
print(msg)
time.sleep(0.5)
server = socketserver.ThreadingTCPServer(('127.0.0.1',9001),Myserver) #t现成
server.serve_forever()
#__author : 'liuyang'
#date : 2019/4/11 0011 上午 10:48
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9001)) while True:
msg = sk.recv(1024)
print(msg)
sk.send(msg)
sk.close()

登录

import json
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen()
conn,addr = sk.accept()
def shou(conn):
len_bytes = conn.recv(4)
num = struct.unpack('i',len_bytes)[0]
str_dic = conn.recv(num).decode('utf-8')
dic = json.loads(str_dic)
print(dic)
with open(dic['filename'],'wb')as f:
while dic['filesize']: #一直减 不为0
content = conn.recv(2048) #超过1500 带宽 拆包了
print(len(content))
f.write(content)
dic['filesize'] -= len(content)
shou(conn)
conn.close()
sk.close()

server

import socket
import os
import json
import struct
sk = socket.socket()
sk.connect(('127.0.0.1',9001))
def chuan(sk):
filepath = input('请输入文件路径 :')
filename = os.path.basename(filepath)
filesize = os.path.getsize(filepath)
dic = {'filesize':filesize,'filename':filename}
str_dic = json.dumps(dic)
bytes_dic = str_dic.encode('utf-8')
len_bytes = struct.pack('i',len(bytes_dic))
sk.send(len_bytes)
sk.send(bytes_dic)
with open(filepath,'rb') as f:
while filesize > 2048:
content = f.read(2048)
print(len(content))
sk.send(content)
filesize -= 2048
else: #最后读剩下的 不用判断
content = f.read()
sk.send(content)
chuan(sk)
sk.close()

teacher

import json
import socket
import struct
import hashlib
def get_md5(usr,pwd):
md5 = hashlib.md5(usr.encode('utf-8'))
md5.update(pwd.encode('utf-8'))
return md5.hexdigest() def login(conn):
msg = conn.recv(1024).decode('utf-8')
dic = json.loads(msg)
with open('userinfo', encoding='utf-8') as f:
for line in f:
username, password = line.strip().split('|')
if username == dic['user'] and password == get_md5(dic['user'], dic['passwd']):
res = json.dumps({'flag': True}).encode('utf-8')
conn.send(res)
return True
else:
res = json.dumps({'flag': False}).encode('utf-8')
conn.send(res)
return False def upload(conn):
len_bytes = conn.recv(4)
num = struct.unpack('i', len_bytes)[0]
str_dic = conn.recv(num).decode('utf-8')
dic = json.loads(str_dic) with open(dic['filename'], 'wb') as f:
while dic['filesize']:
content = conn.recv(2048)
f.write(content)
dic['filesize'] -= len(content) sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen()
while True:
try:
conn,addr = sk.accept()
ret = login(conn)
if ret:
upload(conn)
except Exception as e:
print(e)
finally:
conn.close()
sk.close()
import os
import json
import socket
import struct def upload(sk):
# 上传文件
file_path = input('>>>')
filename = os.path.basename(file_path)
filesize = os.path.getsize(file_path)
dic = {'filename': filename, 'filesize': filesize}
bytes_dic = json.dumps(dic).encode('utf-8') len_bytes = struct.pack('i', len(bytes_dic))
sk.send(len_bytes)
sk.send(bytes_dic) with open(file_path, 'rb') as f:
while filesize > 2048:
content = f.read(2048)
sk.send(content)
filesize -= 2048
else:
content = f.read()
sk.send(content) usr = input('username :')
pwd = input('password :')
dic = {'operate':'login','user':usr,'passwd':pwd}
bytes_dic = json.dumps(dic).encode('utf-8')
sk = socket.socket()
sk.connect(('127.0.0.1',9001))
sk.send(bytes_dic) res = sk.recv(1024).decode('utf-8')
dic = json.loads(res)
if dic['flag']:
print('登录成功')
upload(sk)
else:
print('登录失败') sk.close()

client

自己

import socket
import os
import json
import struct
sk = socket.socket()
sk.connect(('127.0.0.1',9001))
def chuan(sk):
filepath = input('请输入文件路径 :')
filename = os.path.basename(filepath)
filesize = os.path.getsize(filepath)
dic = {'filesize':filesize,'filename':filename}
str_dic = json.dumps(dic)
bytes_dic = str_dic.encode('utf-8')
len_bytes = struct.pack('i',len(bytes_dic))
sk.send(len_bytes)
sk.send(bytes_dic)
with open(filepath,'rb') as f:
while filesize > 2048:
content = f.read(2048)
print(len(content))
sk.send(content)
filesize -= 2048
else: #最后读剩下的 不用判断
content = f.read()
sk.send(content)
flag = sk.recv(1034).decode('utf-8')
print(flag)
def login(sk):
user = input('username:')
pwd = input('password')
dic = {'operate':'login','user':user,'pwd':pwd}
bytes_dic = json.dumps(dic).encode('utf-8')
sk.send(bytes_dic)
res = sk.recv(1024).decode('utf-8')
dic = json.loads(res)
if dic['flag']:
print('登录成功')
return True
# 文件上传
else:
print('登录失败')
return False
def again_upload(sk): # len_bytes = sk.recv(4)
# num = struct.unpack('i', len_bytes)[0]
# str_dic = sk.recv(num).decode('utf-8')
# dic = json.loads(str_dic)
# print(dic)
# with open(dic['filename'], 'wb')as f:
# while dic['filesize']: # 一直减 不为0
# content = sk.recv(2048) # 超过1500 带宽 拆包了
# print(len(content))
# f.write(content)
# dic['filesize'] -= len(content)
# 到最后都发送过来内容 文件大小一直减 到最后为零了
# sk.close()
with open('xiazai', 'wb')as f:
a = sk.recv(100000000)
f.write(a)
# login(sk)
# 合起来 不同的功能放在不同的函数里面
# 判断了 先登录再上传
global xiazai1
if login(sk) :
chuan(sk)
print('传输完')
xiazai1 = True
else:
print('没传输') # if flag=='Y':
# again_upload(sk)
# print('接受完')
# else:
# print('没接收完')
sk.close()
# '''

client

#__author : 'liuyang'
#date : 2019/4/11 0011 下午 4:46
#__author : 'liuyang'
#date : 2019/4/11 0011 下午 3:16
# '''
import socket
import os
import json
import struct
sk = socket.socket()
sk.connect(('127.0.0.1',9001))
def chuan(sk):
filepath = input('请输入文件路径 :')
filename = os.path.basename(filepath)
filesize = os.path.getsize(filepath)
dic = {'filesize':filesize,'filename':filename}
str_dic = json.dumps(dic)
bytes_dic = str_dic.encode('utf-8')
len_bytes = struct.pack('i',len(bytes_dic))
sk.send(len_bytes)
sk.send(bytes_dic)
with open(filepath,'rb') as f:
while filesize > 2048:
content = f.read(2048)
print(len(content))
sk.send(content)
filesize -= 2048
else: #最后读剩下的 不用判断
content = f.read()
sk.send(content)
flag = sk.recv(1034).decode('utf-8')
print(flag)
def login(sk):
user = input('username:')
pwd = input('password')
dic = {'operate':'login','user':user,'pwd':pwd}
bytes_dic = json.dumps(dic).encode('utf-8')
sk.send(bytes_dic)
res = sk.recv(1024).decode('utf-8')
dic = json.loads(res)
if dic['flag']:
print('登录成功')
return True
# 文件上传
else:
print('登录失败')
return False
def again_upload(sk): # len_bytes = sk.recv(4)
# num = struct.unpack('i', len_bytes)[0]
# str_dic = sk.recv(num).decode('utf-8')
# dic = json.loads(str_dic)
# print(dic)
# with open(dic['filename'], 'wb')as f:
# while dic['filesize']: # 一直减 不为0
# content = sk.recv(2048) # 超过1500 带宽 拆包了
# print(len(content))
# f.write(content)
# dic['filesize'] -= len(content)
# 到最后都发送过来内容 文件大小一直减 到最后为零了
# sk.close()
with open('xiazai', 'wb')as f:
a = sk.recv(100000000)
f.write(a)
# login(sk)
# 合起来 不同的功能放在不同的函数里面
# 判断了 先登录再上传
global xiazai1
if login(sk) :
chuan(sk)
print('传输完')
xiazai1 = True
else:
print('没传输') # if flag=='Y':
# again_upload(sk)
# print('接受完')
# else:
# print('没接收完')
sk.close()
# '''

server

day30的更多相关文章

  1. Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析

    Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...

  2. python 全栈开发,Day30(纸牌游戏,异常和错误,异常处理)

    一.纸牌游戏                                                                                              ...

  3. day30 主机管理-堡垒机3-操作记录

    课堂代码:https://github.com/liyongsan/git_class/tree/master/day30

  4. day30——socket套接字(完全版)

    day30 基于TCP协议的socket循环通信 server import socket phone = socket.socket() phone.bind(("127.0.0.1&qu ...

  5. day30线程(Threads)

    day30线程(Threads) 1.开启线程 一.什么是线程: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程. 2.主进程中的线程称为主线程,其他开启的线程称 ...

  6. 碎碎念,浅饮-------Day30

    这不是关于技术的文章,它偏离了我原来的计划轨迹.但,我相信这将是远远超出了技术的意义使我无论什么价格值. 高考已经开始,不知道在这片宁静的夜空下有多少人已经美美的睡了,香甜憨然.又有多少人这睡着的眼角 ...

  7. DAY30、网络编程

    一.网络编程 软件开发 c/s架构 c:客户端 s:服务端 b/s架构 b:浏览器 s:服务端 本质:b/s其实也是c/s 服务端:24小时不间断提供服务,谁来救服务谁 客户端:想什么时候体验服务,就 ...

  8. day30 网络编程 之进程,线程,协程

    进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...

  9. 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解

    今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...

随机推荐

  1. Python【每日一问】02

    问:列表 test = [1,2,3,1,3,4,5,67,7,8,54,1,2,3,4,5,6],如何删除该列表的重复元素? 方法1:利用集合的不重复性 # 利用集合的不重复性 test = [1, ...

  2. 并发之lock的condition接口

    13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...

  3. 2017-2018-2 20165312 实验四《Android程序设计》实验报告

    2017-2018-2 20165312 实验四<Android程序设计>实验报告 一.安装Android Studio并进行Hello world测试和调试程序 安装Android St ...

  4. 第18课 类型萃取(2)_获取返回值类型的traits

    1. 获取可调用对象返回类型 (1)decltype:获取变量或表达式的类型(见第2课) (2)declval及原型 ①原型:template<class T> T&& d ...

  5. 移动端使用mint-ui loadmore实现下拉刷新上拉显示更多

    前序:在使用vue做一个h5项目的时候,需要上拉分页加载,实践中总结一下: 首先要安装mint-ui npm i mint-ui -S 然后引入,一般在main.js里面 import Vue fro ...

  6. ORACLE在IMP时候出现数据丢失

    IMP-00019: 由于 ORACLE 错误 12899 而拒绝行 IMP-00003: 遇到 ORACLE 错误 12899 ORA-12899: 列 "JACKEYJ".&q ...

  7. how find out what is causing Visual Studio to think each project is out of date

    You can find out what is causing Visual Studio to think each project is out of date, and then addres ...

  8. 《算法导论》——随机化快排RandomizedQuickSort

    今日算法:随机化快排RandomizedQuickSort 基础工作swap交换和partition分治 /* *交换数组的两个元素 *fromIndex和toIndex为要交换的两个元素的索引 */ ...

  9. input输入限制

    1:只能输入两位小数点:function keepTwoPointNum(that){ var val=that.value; if(isNaN(val)){ $(that).val(''); ret ...

  10. python excel 像 Excel 一样使用 python 进行数据分析

    https://www.jb51.net/article/63216.htm 像 Excel 一样使用 python 进行数据分析 :  https://www.cnblogs.com/nxld/p/ ...