前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >socketserver模块实现并发和连

socketserver模块实现并发和连

作者头像
py3study
发布2020-01-19 17:21:27
5540
发布2020-01-19 17:21:27
举报
文章被收录于专栏:python3

一.socketserver模块

1.sockeserver的源码流程

  2.简单的使用

socketserver服务端

代码语言:javascript
复制
import socketserver

class MyServer(socketserver.BaseRequestHandler):

    def handle(self):
        msg = self.request.recv(1024)
        print(msg)


if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer)  # 实例化对象
    server.serve_forever()  

socket客户端

代码语言:javascript
复制
import socket

client = socket.socket()
ip_port = ("127.0.0.1",8888)
client.connect(ip_port)

client.send(b"hello")

二.连接的合法性验证

1.os.urandom(n)加密

    os.urandom(n)是一种bytes类型的随机生成n个字节字符串,而且每次生成的值都不相同,再加上md5等加密处理,就成了内容不同长度相同的字符串了

  2.hmac

    python自带的hmac模块实现了标准的Hmac算法

代码语言:javascript
复制
import hmac
message = b'Hello world'     # 加密信息
key = b'secret'         # 加密密匙
h = hmac.new(key,message,digestmod='MD5')  # 密匙,信息,模式
print(h.hexdigest())
比较两个密文是否相同,可以用hmac.compare_digest(密文、密文),返回True或者False。

  3.连接合法性验证服务端和客户端

服务端

代码语言:javascript
复制
import socket
import hmac , os

secret_key = b"This is key!"

# 只做验证 返回bool
def conn_auth(conn):
    print("连接认证")

    msg = os.urandom(32)
    conn.send(msg)
    h = hmac.new(secret_key,msg)
    server_key = h.digest()
    client_key = conn.recv(32)
    # print(server_key,client_key)

    return  hmac.compare_digest(server_key,client_key)

# 判断验证
def data(conn):

    if conn_auth(conn):
        print("验证成功!")
        conn.send("验证成功".encode("utf-8"))
        while 1:
            data = conn.recv(1024)
            print(data)

    else:
        print("验证失败")
        conn.send("验证失败".encode("utf-8"))
        conn.close()
        return

# 启动
def tcp_server(ip_port,):

    server = socket.socket()
    server.bind(ip_port)
    server.listen()
    while 1:
        conn,addr = server.accept()
        print(f"新连接: {addr[0]}:{addr[1]}")
        data(conn)

if __name__ == '__main__':
    ip_port = ("127.0.0.1",8888)
    tcp_server(ip_port)

View Code

客户端

代码语言:javascript
复制
import socket
import os, hmac

# 密匙
sercet_key = b"This is key!"

# 使用密匙验证连接是否合法
def conn_auth(client):
    msg = client.recv(32)
    h = hmac.new(sercet_key, msg)
    client_key = h.digest()
    client.send(client_key)

# 验证判断
def tcp_client(ip_port):
    client = socket.socket()
    client.connect(ip_port)
    conn_auth(client)
    verify = client.recv(12).decode("utf-8")

    while verify == "验证成功":
        data = input("给服务端发送:").encode("utf-8")
        client.send(data)

    else:
        print("连接被拒绝")
        client.close()

if __name__ == '__main__':
    ip_port = ("127.0.0.1", 8888)
    tcp_client(ip_port)

View Code

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档