网络编程(续)

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

如果想在分布式系统中实现一个简单的客户端链接认证功能,可以利用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)

 

posted @ 2018-02-02 23:04  一种清孤不等闲  阅读(122)  评论(0编辑  收藏  举报
Live2D