博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之socketserver模块和验证客户端链接的合法性
阅读量:7238 次
发布时间:2019-06-29

本文共 4369 字,大约阅读时间需要 14 分钟。

验证客户端链接的合法性

分布式系统中实现一个简单的客户端链接认证功能

#_*_coding:utf-8_*_from socket import *import hmac,ossecret_key=b'linhaifeng bang bang bang'def conn_auth(conn):    '''    认证客户端链接    :param conn:    :return:    '''    print('开始验证新链接的合法性')    msg=os.urandom(32)    conn.sendall(msg)    h=hmac.new(secret_key,msg)    digest=h.digest()    respone=conn.recv(len(digest))    return hmac.compare_digest(respone,digest)def data_handler(conn,bufsize=1024):    if not conn_auth(conn):        print('该链接不合法,关闭')        conn.close()        return    print('链接合法,开始通信')    while True:        data=conn.recv(bufsize)        if not data:break        conn.sendall(data.upper())def server_handler(ip_port,bufsize,backlog=5):    '''    只处理链接    :param ip_port:    :return:    '''    tcp_socket_server=socket(AF_INET,SOCK_STREAM)    tcp_socket_server.bind(ip_port)    tcp_socket_server.listen(backlog)    while True:        conn,addr=tcp_socket_server.accept()        print('新连接[%s:%s]' %(addr[0],addr[1]))        data_handler(conn,bufsize)if __name__ == '__main__':    ip_port=('127.0.0.1',9999)    bufsize=1024    server_handler(ip_port,bufsize)服务端
服务端
#_*_coding:utf-8_*___author__ = 'Linhaifeng'from socket import *import hmac,ossecret_key=b'linhaifeng bang bang bang'def conn_auth(conn):    '''    验证客户端到服务器的链接    :param conn:    :return:    '''    msg=conn.recv(32)    h=hmac.new(secret_key,msg)    digest=h.digest()    conn.sendall(digest)def client_handler(ip_port,bufsize=1024):    tcp_socket_client=socket(AF_INET,SOCK_STREAM)    tcp_socket_client.connect(ip_port)    conn_auth(tcp_socket_client)    while True:        data=input('>>: ').strip()        if not data:continue        if data == 'quit':break        tcp_socket_client.sendall(data.encode('utf-8'))        respone=tcp_socket_client.recv(bufsize)        print(respone.decode('utf-8'))    tcp_socket_client.close()if __name__ == '__main__':    ip_port=('127.0.0.1',9999)    bufsize=1024    client_handler(ip_port,bufsize)客户端(合法)
客户端
#_*_coding:utf-8_*___author__ = 'Linhaifeng'from socket import *def client_handler(ip_port,bufsize=1024):    tcp_socket_client=socket(AF_INET,SOCK_STREAM)    tcp_socket_client.connect(ip_port)    while True:        data=input('>>: ').strip()        if not data:continue        if data == 'quit':break        tcp_socket_client.sendall(data.encode('utf-8'))        respone=tcp_socket_client.recv(bufsize)        print(respone.decode('utf-8'))    tcp_socket_client.close()if __name__ == '__main__':    ip_port=('127.0.0.1',9999)    bufsize=1024    client_handler(ip_port,bufsize)客户端(非法:不知道加密方式)
客户端(非法:不知道加密方式)
#_*_coding:utf-8_*___author__ = 'Linhaifeng'from socket import *import hmac,ossecret_key=b'linhaifeng bang bang bang1111'def conn_auth(conn):    '''    验证客户端到服务器的链接    :param conn:    :return:    '''    msg=conn.recv(32)    h=hmac.new(secret_key,msg)    digest=h.digest()    conn.sendall(digest)def client_handler(ip_port,bufsize=1024):    tcp_socket_client=socket(AF_INET,SOCK_STREAM)    tcp_socket_client.connect(ip_port)    conn_auth(tcp_socket_client)    while True:        data=input('>>: ').strip()        if not data:continue        if data == 'quit':break        tcp_socket_client.sendall(data.encode('utf-8'))        respone=tcp_socket_client.recv(bufsize)        print(respone.decode('utf-8'))    tcp_socket_client.close()if __name__ == '__main__':    ip_port=('127.0.0.1',9999)    bufsize=1024    client_handler(ip_port,bufsize)客户端(非法:不知道secret_key)
客户端(非法:不知道secret_key)

socketserver 模块

实现基于TCP协议下的服务端与客户端的一对多的交互模式

import socketserverclass MyServer(socketserver.BaseRequestHandler):    def handle(self):   # self.request 就相当于一个conn        while True:            print(self.client_address)            msg = self.request.recv(1024).decode('utf-8')            if msg == 'q':break            print(msg)            info = input('%s>>>'%msg[:2])            self.request.send(info.encode('utf-8'))if __name__ == '__main__':    server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)    # thread 线程    server.allow_reuse_address = True    server.serve_forever()
服务端
import socketsk = socket.socket()sk.connect(('127.0.0.1',8080))while True:    msg = input('>>>')    if msg == 'q':        sk.send(b'q')        break    sk.send(('美团 :'+msg).encode('utf-8'))    ret = sk.recv(1024).decode('utf-8')    print(ret)sk.close()
客户端

 

转载于:https://www.cnblogs.com/DI-DIAO/p/8386892.html

你可能感兴趣的文章
bzoj5407: girls
查看>>
BootStrap selectpicker后台动态绑定数据
查看>>
【转】正则基础之——贪婪与非贪婪模式
查看>>
关于 android.net.conn.CONNECTIVITY_CHANGE 7.0之后取消
查看>>
自动化测试的理解
查看>>
微信小程序事件
查看>>
空间直角坐标系、大地坐标系、平面坐标系、高斯平面直角坐标系(转)
查看>>
Java并发编程-可重入锁
查看>>
MySQL5.7.9压缩包安装配置
查看>>
068、Calico的网络结构是什么?(2019-04-11 周四)
查看>>
rails文件夹介绍
查看>>
团对-爬取豆瓣电影top250-开发环境搭建过程
查看>>
apache2.2安装和配置(安装版)
查看>>
轻触开关实现自锁功能
查看>>
浏览器加载显示html页面内容的顺序
查看>>
(八)mybatis之映射器
查看>>
OOP design table chair bench
查看>>
Quartz学习笔记
查看>>
jQuery
查看>>
aix lvm_lv_vg
查看>>