python网络编程3-socketserver模块

一、复习

# 解决黏包问题
#为什么会出现黏包问题
    # 首先只有在TCP协议中才会出现黏包现象
    # 是因为TCP协议是面向流的协议
    # 在发送的数据传输过程中有缓存机制来避免数据丢失
    # 因此在连续发送小数据的时候,以及接收大小不符的时候都容易出现尿包现象
    # 本质还是因为我们在接收数据时不清楚发送数据的长短
# 解决黏包问题
    # 在传输大量数据之前先告诉接收端要发送的数据大小
    # 或者通过struct模块来定制协议
# struct模块
    #pack unpack
    # 模式‘i’
    # pack后的长度:4个字节
    # unpack后的数据是元组:元组的第一个元素才是pack的值

二、hmac加密问题

import hmac
h=hmac.new()   # secrect_key,你想进行加密的bytes
h.digest()  #密文的内容
hmac.compare_digest()  #对比 密文 另外一个密文

 例 验证客户端的合法性

server:

import socket
import os
import hmac
# os.urandom(32)  # 随机生成32位字节
def check_conn(conn):
    msg=os.urandom(32)  # 随机一段内容
    conn.send(msg)
    h=hmac.new(secrect_key,msg)
    digest=h.digest()
    client_digest=conn.recv(1024)
    return hmac.compare_digest(digest,client_digest)

secrect_key=b'egg'
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()

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)

三、socketserver模块

server:

# socket tcp服务 同一时间只能和同一个客户通信
# socketserver tcp服务 同一时间和多个客户通信

import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self): #self.request 就相当于conn
       while True:
            msg=self.request.recv(1024).decode('utf-8')
            if msg=='q':
                break
            print(msg)
            info=input('%s>>>'%msg[:2])
            self.request.send(info.encode('utf-8'))

if __name__ =='__main__':
    server=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
    # thread 线程 一个程序只有一个线程 一个线程就是调度cpu的最小单位
    # 只有用线程才能占用cpu
    server.serve_forever()

# bind、listen
# conn,addr=accept
# self.request=conn
# socket_server
#看源码方法:
#   第一 多个类之间的继承关系要先整理
#   每一个类中的方法,要大致列出来
# 所有的self对象调用要清楚的了解 到底是谁的对象
# 所有的方法调用要退回到最子类的类中开始寻找,逐级查看

client1:

import  socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
    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 True:
    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()

运行结果:

 参考自https://www.cnblogs.com/Eva-J/articles/8244551.html#_label5

猜你喜欢

转载自blog.csdn.net/weixin_38383877/article/details/84834488