zoukankan      html  css  js  c++  java
  • 网络编程(续)

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

    如果想在分布式系统中实现一个简单的客户端链接认证功能,可以利用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)
  • 相关阅读:
    自然语言处理(三)——PTB数据的batching方法
    自然语言处理(二)——PTB数据集的预处理
    自然语言处理(一)——语言模型评价方法
    TensorFlow数据集(二)——数据集的高层操作
    TensorFlow数据集(一)——数据集的基本使用方法
    TensorFlow多线程输入数据处理框架(四)——输入数据处理框架
    Node的简介
    seajs的原理以及基本使用
    git常用指令
    一个小白的四次前端面试经历
  • 原文地址:https://www.cnblogs.com/glf1160/p/8386577.html
Copyright © 2011-2022 走看看