检验客户端合法性和socketserver模块

铺垫os模块一个功能

import os
print(os.urandom(4),len(os.urandom(4)))#能够生成一个括号中数字字节得bytes类型

D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/包/练习.py
b'\xbc\xab\xa0J' 4

Process finished with exit code 0

引入hmac模块

sever端

import socket
import os
import hmac
secret_key=b'egg'
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
def check_conn(conn):
    msg=os.urandom(32)
    conn.send(msg)
    h=hmac.new(secret_key,msg)
    digest=h.digest()
    clent_digest=conn.recv(1024)
    return hmac.compare_digest(digest,clent_digest)
conn,addr=sk.accept()

res=check_conn(conn)
if res:
    print('合法得客户端')
    conn.close()
else:
    print('不合法得客户端')
    conn.close()
sk.close()

client端

import socket
import hmac
secret_key=b'egg'
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
msg=sk.recv(1024)
h=hmac.new(secret_key,msg)
digest=h.digest()
sk.send(digest)
sk.close()

socketserver模块

socket模块和tcp协议只能和一个client端口通信,但是使用socketserver模块可以实现和多个client端口进行通信。

socketserver模块是在socket模块基础上进行了进一步封装,能够实现和多个clent之间得通信。

因为server端只有一个,client端有很多,所以有socketserver但是没有socketclient

 sever端

import socketserver
class MySever(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.request.recv(1024).decode('utf-8'))#self.request就相当于conn

if __name__=='__main__':
    serer=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MySever)#Thread是线程的意思,一个线程就是利用CPU中的一部分空间
    serer.serve_forever()

client端

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send('饿了吗'.encode('utf-8'))
sk.close()

进阶:

 sever端

import socketserver
class MySever(socketserver.BaseRequestHandler):
    def handle(self):
        while 1:
            msg=self.request.recv(1024).decode('utf-8')
            if msg=='q':
                self.request.close()
                break
            print(msg)
            info=input('>>>:')
            self.request.send(info.encode('utf-8'))
if __name__=='__main__':
    serer=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MySever)#Thread是线程的意思,一个线程就是利用CPU中的一部分空间
    serer.serve_forever()

client1端

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while 1:
    msg=input('>>>>')
    if msg=='q':
        sk.send(b'q')
        break
    sk.send(('大众点评:'+msg).encode('utf-8'))
    ret=sk.recv(1024).decode('utf-8')
    print(ret)
sk.close()

client2端

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while 1:
    msg=input('>>>>')
    if msg=='q':
        sk.send(b'q')
        break
    sk.send(('美团:'+msg).encode('utf-8'))
    ret=sk.recv(1024).decode('utf-8')
    print(ret)
sk.close()

 sever端能够同时和client1端和client2端进行通信。

 这段代码没有按照预定当client发送q的时候,断开。没找出原因。

posted @ 2019-04-01 23:10  舒畅123  阅读(81)  评论(0编辑  收藏  举报