欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

python网络编程3-socketserver模块

发布时间:2025/3/15 python 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 hmacsecret_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 socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self): #self.request 就相当于connwhile True:msg=self.request.recv(1024).decode('utf-8')if msg=='q':breakprint(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的最小单位# 只有用线程才能占用cpuserver.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')breaksk.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')breaksk.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

总结

以上是生活随笔为你收集整理的python网络编程3-socketserver模块的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。