Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)

时间:2022-05-27 05:40:49

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数据  
Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)
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() 得到阻塞套接字操作的超时时间
Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)
 
 
面向文件的套接字的函数
s.fileno()          套接字的文件描述符
s.makefile()        创建一个与该套接字相关的文件

 

socket模块化,验证客户端合法性

   import hmac

    h=hmac.new(secret_key,msg) #bytes   盐+msg
    digest=h.digest()  #bytes
Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)
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()
Server
Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)
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()
Client

 

socketserver

Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)Python Day 29 ( socket中的一些常见方法,登录验证,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()
socketserver
Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)
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'))
client

 

进度条:

Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)Python Day 29 ( socket中的一些常见方法,登录验证,socketserver模块)
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()
进度条