day30
作业
#__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的更多相关文章
- Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析
Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...
- python 全栈开发,Day30(纸牌游戏,异常和错误,异常处理)
一.纸牌游戏 ...
- day30 主机管理-堡垒机3-操作记录
课堂代码:https://github.com/liyongsan/git_class/tree/master/day30
- day30——socket套接字(完全版)
day30 基于TCP协议的socket循环通信 server import socket phone = socket.socket() phone.bind(("127.0.0.1&qu ...
- day30线程(Threads)
day30线程(Threads) 1.开启线程 一.什么是线程: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程. 2.主进程中的线程称为主线程,其他开启的线程称 ...
- 碎碎念,浅饮-------Day30
这不是关于技术的文章,它偏离了我原来的计划轨迹.但,我相信这将是远远超出了技术的意义使我无论什么价格值. 高考已经开始,不知道在这片宁静的夜空下有多少人已经美美的睡了,香甜憨然.又有多少人这睡着的眼角 ...
- DAY30、网络编程
一.网络编程 软件开发 c/s架构 c:客户端 s:服务端 b/s架构 b:浏览器 s:服务端 本质:b/s其实也是c/s 服务端:24小时不间断提供服务,谁来救服务谁 客户端:想什么时候体验服务,就 ...
- day30 网络编程 之进程,线程,协程
进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...
- 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解
今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...
随机推荐
- 在WINDOWS7下无U盘安装WINDOWS10
第一步:下载cn_windows_10_business_editions_version_1803_updated_march_2018_x64_dvd_12063730.iso 第二步:解压里面的 ...
- [UE4]瞬移
1.设置Input,事件名称设置为Teleport 2.设置事件Teleport 3.
- Program type already present: android.support.v4.widget.EdgeEffectCompat
1.确保所有依赖包的 implementation 'com.android.support:appcompat-v7:25.4.0'是一样的 2.确保最外层的build.gradle中增加如下代码: ...
- 【转】java面试题
http://blog.csdn.net/jackfrued/article/details/44921941 Java面试题转
- shell脚本四-三剑客
Shell编程——三剑客 简介 Grep:默认不支持扩展表达式,加-E或者egrep Awk:支持所有zhengze Sed默认不支持扩展表达式,加-r 2.sed语法格式 Sed 选项 命令 文件( ...
- 微信小程序 实现三级联动-省市区
github项目地址 https://github.com/z1511676208/chooseAddr 序:项目中需要用到三级联动,自己试着写了下,也查了一些资料,现在把这个记录一下,里面地区数 ...
- 203. 阿里jetcache
[视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源码: ...
- 27.Socket,TCP,UDP,HTTP基本通信原理
Socket,TCP,UDP,HTTP基本通信原理(摘自百度): TCP.UDP,HTTP 底层通信都是通过 socket 套接字实现 网络上不同的计算机,也可以通信,那么就得使用网络套接字(sock ...
- Apollo配置中心
背景: 当前我们项目,所有的配置基本都是通过本地properties 文件进行配置的,比如ip地址.端口.消息中间件和数据库连接的各种参数,当我们需要切换环境或调整参数的时候,我们必须手动的修改这些配 ...
- springmvc 怎么响应json数据
springmvc 怎么响应json数据@Controller@RequestMapping("/items") class ItemsController{ @RequestM ...