• 网络编程(续)


    一,验证客户端链接的合法性

    如果想在分布式系统中实现一个简单的客户端链接认证功能,可以利用hmac实现。

    import socket
    import hmac
    import os
    secret_key='中国'.encode('utf-8')               #设置密钥
    sk=socket.socket()
    sk.bind(('127.0.0.1',8090))
    sk.listen()
    
    def chack_conn(conn):
        msg=os.urandom(32)                             #随机生成32个字节的bytes类型
        conn.send(msg)
        h=hmac.new(secret_key,msg)            
        digest=h.digest()
        client_digest=conn.recv(1024)
        return hmac.compare_digest(digest,client_digest)    #比较密文一致性
    
    conn,addr=sk.accept()
    res=chack_conn(conn)
    
    if res:
        print('合法')
        conn.close()
    else:
        print('不合法')
        conn.close()
    sk.close()
    服务端
    import hmac
    import socket
    secret_key='fgdf'.encode('utf-8')
    sk=socket.socket()
    sk.connect(('127.0.0.1',9090))
    msg=sk.recv(1024)
    h=hmac.new(secret_key,msg)
    digest=h.digest()
    sk.send(digest)
    sk.close()
    客户端

    二,socketserver(实现和多个客户端链接交互)

    import socketserver
    
    class MyServer(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                #print(self.client_address)                         #获取IP地址和端口
                msg=self.request.recv(1024).decode('utf-8')
                if msg=='q':break
                print(msg)
                info=input('%s'%msg[0:2]+  '>>>')
                self.request.send(('爷爷 :'+info).encode('utf-8'))
    
    if __name__=='__main__':
        server=socketserver.ThreadingTCPServer(('127.0.0.1',8090),MyServer)
        # server.allow_reuse_address=True            #端口重用
        server.serve_forever()
    
    #地址(端口)重用可以多个socket绑定一个地址。
    # 比如程序中有两个socket都要从某个地址的同一个端口接收数据。
    # 一般情况下,绑定第一个socket后,第二个socket会绑定失败。
    # 这时可以利用地址重用,在绑定端口之前调用。
    #写法不变
    
    
    import socket
    sk=socket.socket()
    sk.connect(('127.0.0.1',8090))
    while 1:
        info_cli=input('>>>')
        if info_cli=='q':
            sk.send(b'q')
            break
        sk.send(('二娃 :'+info_cli).encode('utf-8'))
        d=sk.recv(1024).decode('utf-8')
        print(d)

    客户端2

    import socket
    sk=socket.socket()
    sk.connect(('127.0.0.1',8090))
    
    while True:
        msg=input(">>>")
        if msg=='q':
            sk.send(b'q')
            break
        sk.send(('大娃 :'+msg).encode('utf-8'))
        see=sk.recv(1024).decode('utf-8')
        print(see)
  • 相关阅读:
    php 高精度计算函数
    CSS 文本溢出显示省略号样式
    Vue import、export及export default示例详解,附带如何实现全局调用
    利用高德API获取最新的省市区数据
    TP5 基类验证器
    php 两种递归方法
    新建PO類型ZFA的固定資產時灰掉 GR Non-Valuated
    MRP 參數設置
    info record
    kill procedure in os level
  • 原文地址:https://www.cnblogs.com/glf1160/p/8386577.html
Copyright © 2020-2023  润新知