Python全栈开发--socketserver模块和验证客户端链接的合法性

Posted 低调的人儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python全栈开发--socketserver模块和验证客户端链接的合法性相关的知识,希望对你有一定的参考价值。

验证客户端链接的合法性

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

技术分享图片
#_*_coding:utf-8_*_
from socket import *
import hmac,os

secret_key=blinhaifeng 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,os

secret_key=blinhaifeng 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,os

secret_key=blinhaifeng 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 socketserver
class 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 socket
sk = socket.socket()
sk.connect((127.0.0.1,8080))
while True:
    msg = input(>>>)
    if msg == q:
        sk.send(bq)
        break
    sk.send((美团 :+msg).encode(utf-8))
    ret = sk.recv(1024).decode(utf-8)
    print(ret)
sk.close()
客户端

 

以上是关于Python全栈开发--socketserver模块和验证客户端链接的合法性的主要内容,如果未能解决你的问题,请参考以下文章

4Python全栈之路系列之socketsesrver实现多并发

2018-07-03-Python全栈开发day24-面向对象设计

Python全栈Socket网络编程

4Python全栈之路系列之Django模型

Python自动化开发从浅入深-进阶(socketServer)

python开发学习-day08(socket高级socketserver进程线程)