热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python学习笔记day33socketserver模块解决TCP不能同时跟多个client同时通信的问题...

1.前言TCP启的socketserver端是不能同时跟多个client进行通信的,但是现在我们可以使用一个模块socketserver模块来帮助我们完成这个功能&#

1. 前言

TCP启的socket server端是不能同时跟多个client进行通信的,但是现在我们可以使用一个模块socketserver模块来帮助我们完成这个功能:

2. socketserver实现server和多个client同时通信

# server.py
import socketserver
class Myserver(socketserver.BaseRequestHandler):def handle(self):while True:ret=self.request.recv(1024).decode("utf-8")print(ret)info=input(">>>")self.request.send(bytes(info.encode("utf-8")))if __name__=="__main__":server=socketserver.ThreadingTCPServer(("127.0.0.1",8080),Myserver)server.serve_forever()

 

# client.py
import socket
sk
=socket.socket()
sk.connect((
"127.0.0.1",8080))
while True:info=input(">>>")sk.send(bytes(("来自璇璇的消息:"+info).encode("utf-8")))ret=sk.recv(1024).decode("utf-8")print(ret)sk.close()

 

# client2.py
import socket
sk
=socket.socket()
sk.connect((
"127.0.0.1",8080))
while True:info=input(">>>")sk.send(bytes(('来自嘻嘻的消息:'+info).encode("utf-8")))ret=sk.recv(1024).decode("utf-8")print(ret)
sk.close()

 

3. 使用socketserver 使得server与多个client 交互之前 使用hmac对客户端进行验证

# server.py
import os
import socketserver # 由于TCP起的server同一时间不能跟多个客户端通信,socketserver模块刚好解决了该问题
import hmac # server端和合法的客户端有相同的密钥,server端给客户端发送要加密的bytes类型# 客户端也使用hmac进行加密,将结果返回给server端,server端比较两个加密的结果
secret_key=b"xuanxuan" # server和合法的客户端之间的密钥(约定好的,双方都已知的)class MyServer(socketserver.BaseRequestHandler): # 自己定义的类Myserver必须要继承BaseRequestHandlerdef handle(self): # 该类中必须要定义的方法msg=os.urandom(32) # 随机生成一个32位的字节,用于发送给client端,进行验证(配合密钥)self.request.send(msg) # self.request相当于socket中的conn表示一个连接h=hmac.new(secret_key,msg) # 获得需要加密的对象 一个是双方约定好的密钥 ,另一个是随机生成的bytes类型的需要加密的信息digest=h.digest() # 加密client_digest=self.request.recv(1024)ret=hmac.compare_digest(digest,client_digest)if ret:while True:ret=self.request.recv(1024).decode("utf-8")print(ret)info=input(">>>")self.request.send(bytes(info.encode("utf-8")))else:print("不合法的客户端,我要断开连接")if __name__=="__main__":server=socketserver.ThreadingTCPServer(("127.0.0.1",8080),MyServer) # 必须要传两个参数 IP地址 端口号,还有上面定义的类名server.serve_forever() # 永久起一个服务

 

# client.py
import socket
import hmac
secret_key
=b"xuanxuan" # 跟server端的密钥一样,是合法的客户端
sk=socket.socket()
sk.connect((
"127.0.0.1",8080))
msg
=sk.recv(1024) # hmac.new()操作的对象都是bytes类型的,所以先不解码啦

h
=hmac.new(secret_key,msg)
client_digest
=h.digest()
sk.send(client_digest)
# 把加密后的给server端发过去
while True:info=input(">>>")sk.send(bytes(("来自客户端1的消息:"+info).encode("utf-8")))ret=sk.recv(1024).decode("utf-8")print(ret)
sk.close()

 

# client2.py
import socket
import hmac
secret_key
=b"xuan" # 跟server端的密钥不一样,不是合法的客户端
sk=socket.socket()
sk.connect((
"127.0.0.1",8080))
msg
=sk.recv(1024) # hmac.new()操作的对象都是bytes类型的,所以先不解码啦
h=hmac.new(secret_key,msg)
client_digest
=h.digest()
sk.send(client_digest)
# 把加密后的给server端发过去
while True:info=input(">>>")sk.send(bytes(("来自客户端2的消息:"+info).encode("utf-8")))ret=sk.recv(1024).decode("utf-8")print(ret)
sk.close()

我们先启动server 和 client1:

 

 

 

 server和client可以正常建立连接,但是当启动client2时(不合法的客户端,因为密钥不一样)server端就会立即中止连接(这里我只是完成了打印)

 

转:https://www.cnblogs.com/xuanxuanlove/p/9750877.html



推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
author-avatar
霸气的艳子_612
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有