Python Day 29 网络编程 ( socket中的一些常见方法,登录验证,socketserver模块)
Python Day 29 网络编程 ( socket中的一些常见方法,socketserver模块)
socket中的一些常见方法
服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据
![]()
s.sendall() 发送TCP数据 尝试一次性都发出去,如果发不出去就报错,发出去就返回None
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式 默认True阻塞
s.settimeout() 设置阻塞套接字操作的超时时间 秒为单位 设置一下超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
![]()
面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
socket模块化,验证客户端合法性
import hmac
h=hmac.new(secret_key,msg) #bytes 盐+msg digest=h.digest() #bytes

import socket from socket import SOL_SOCKET,SO_REUSEADDR import hashlib import os bindip=('127.0.0.1',8091) def mysock(): sk = socket.socket() # sk.setblocking(False) # sk.settimeout(2000) sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) sk.bind((bindip)) sk.listen(5) while True: conn, addr = sk.accept() while True: server_check_client(conn, addr) break sk.close() def server_check_client(conn, addr): salt = b'haha1' md5_obj = hashlib.md5(salt) random_bytes = os.urandom(32) md5_obj.update(random_bytes) truekey = md5_obj.hexdigest() conn.send(random_bytes) clientcode = conn.recv(1024).decode('utf-8') if truekey == clientcode : server_talk(conn, addr) conn.close() else: msg = '滚粗' conn.send(msg.encode('utf-8')) def server_talk(conn, addr): conn.send('连接成功啦,欢迎吐槽!'.encode('utf-8')) while True: try: msg_r = conn.recv(1024).decode('utf-8') if msg_r.upper() == 'Q': break print(msg_r) msg_s = input('>>>') conn.send(msg_s.encode('utf-8')) except Exception as e: print(addr,e) return False mysock()

import socket import hashlib def mysock(): sk = socket.socket() # sk.setblocking(False) # sk.settimeout(10) r = sk.connect_ex(('127.0.0.1', 8091)) if r == 0: msg = sk.recv(1024) client_login(sk,msg) client_talk(sk) sk.close() def client_login(sk,key): salt = b'haha1' md5_obj = hashlib.md5(salt) md5_obj.update(key) client_key = md5_obj.hexdigest() sk.send(client_key.encode('utf-8')) def client_talk(sk): while True: try: msg_r = sk.recv(1024).decode('utf-8') print(msg_r) msg_s = input('>>>') sk.send(msg_s.encode('utf-8')) if msg_s.upper() == 'Q': break except Exception as e: print(e) return False mysock()
socketserver

import socketserver import json import hashlib class MyServer(socketserver.BaseRequestHandler): def handle(self): str_dic = self.request.recv(1024).decode('utf-8') dic = json.loads(str_dic) md5_obj = hashlib.md5(dic['username'].encode('utf-8')) md5_obj.update(dic['password'].encode('utf-8')) mw_pwd = md5_obj.hexdigest() with open('userinfo',encoding='utf-8') as f: for line in f: username,passwd = line.strip().split(':') if username.strip() == dic['username'] and passwd.strip() == mw_pwd: print('连接') return print('密码不对') server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer) server.serve_forever()

import socket import json sk = socket.socket() sk.connect(('127.0.0.1',8080)) username = input('请输入用户名>>>') password = input('请输入密码 >>>') dic ={'username':username,'password':password} str_dic = json.dumps(dic) sk.send(str_dic.encode('utf-8'))
进度条:

import time def func1(): for i in range(0,102,2): num = i // 2 print('\r%s%% %s>' % (i,'='*num),end='') time.sleep(0.2) func1() def func2(): for i in range(1, 101, 1): num1 = i//3 num2 = 101//3 - num1 print('\r\033[1;31m{}\033[0m{}%'.format(num1 * '▅'+num2*' ', i ), end='') time.sleep(0.1) func2()