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 可以把光標移動到行首但不換行# 打印進度條View Code
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 socketsk = 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 socketsecret_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 hashlibsecret_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 hmachmac = 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# 密鑰+ 隨機的字符串 通過特殊的算法得到一個結果 比對# 密鑰+ 隨機+特殊算法 難破解View Code
#__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()View Code
并發
#__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 只要有人連 執行handlefor 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 只要有人連 執行handlefor 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()View Code
#__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()View Code
登錄
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']: #一直減 不為0content = 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 -= 2048else: #最后讀剩下的 不用判斷content = f.read()sk.send(content) chuan(sk) sk.close()View Code
?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 Trueelse:res = json.dumps({'flag': False}).encode('utf-8')conn.send(res)return Falsedef 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()View Code
import os import json import socket import structdef 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 -= 2048else: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 -= 2048else: #最后讀剩下的 不用判斷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 -= 2048else: #最后讀剩下的 不用判斷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
?
轉載于:https://www.cnblogs.com/Doner/p/10688978.html
總結
- 上一篇: M_Map画南海水深地形图
- 下一篇: eclipse实用快捷键