python网络编程之socket(二)
发布日期:2021-10-31 07:31:31
浏览次数:20
分类:技术文章
本文共 2736 字,大约阅读时间需要 9 分钟。
socketserver
socket并不能多并发,只能支持一个用户。socketserver则实现了并发处理。当有多个客户端连接时,socketserver都会在服务器上创建一个线程或进程来处理该客户端的请求,一个客户端对应一个服务端的进程或线程,这样增加系统的利用率。
socketserver是socket的封装,简化了编写网络服务程序的任务。python2中为SocketServer,python3中取消了首字母大写,改为socketserver。socketserver中包含了两种类,一种为服务类(server class),一种为请求处理类(request handle
class)。前者提供了许多方法,像绑定、监听、运行(建立连接的过程),后者则专注于如何处理用户所发送的数据(事务逻辑)。一般情况下,所有的服务都是先建立连接(也就是建立服务类的实例),然后开始处理用户请求(也就是建立请求处理类的实例)。
socketserver有4个类,分别是TCPServer、UDPServer、UnixStreamServer和UnixDatagramServer。
- class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True) TCP协议
- class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True) UDP协议,传输过程中可能会造成数据丢失等情况。
- class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True) tcp协议,用于unix机器的进程间通信,不可用于windows主机。
- class socketserver.UnixDatagramServer(server_address, RequestHandlerClass, bind_and_activate=True) udp协议,用于unix机器的进程间通信,不可用于windows主机。 继承关系
+------------+| BaseServer |+------------+ | v+-----------+ +------------------+| TCPServer |------->| UnixStreamServer |+-----------+ +------------------+ | v+-----------+ +--------------------+| UDPServer |------->| UnixDatagramServer |+-----------+ +--------------------+
上述的4个类用于处理同步的请求,也就是当前请求必须处理完成才能开始下一个请求。不适用于单个请求处理时间很长的情况。
单个请求处理需要很长时间的情况,可以创建一个单独的线程或进程去处理每个请求,ForkingMixIn和ThreadingMixIn类支持异步请求。 当从ThreadingMixIn继承线程连接时,应该明确声明线程意外关闭时的行为。ThreadingMixIn类中定义了一个属性daemon_threads,它用来标识服务器是否等待线程终止。如果希望线程自动执行,应该明确设置标识,默认情况下是False,也就是python将会在ThreadingMixIn创建的所有线程都退出之后才退出。 不论采用何种协议,服务类(server class)的外部方法和属性都是相同的。创建
创建一个请求处理类,并且这个类要继承BaseRequsetHandler类,重写父类的handle()方法。 实例化一个服务类,并给它传递服务端IP地址和上面的请求处理类。推荐在server使用with语句。 调用服务对象的handle_request()或者server_forever()方法,前者用于处理一个请求,后者用于处理多个请求。 调用server_close()关闭socket(使用with语句则不需要)。 实例 服务端import socketserverclass MyTcpHandler(socketserver.BaseRequestHandler): def handle(self): while True: try: self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0]), end=" ") print(self.data) self.request.sendall(self.data.upper()) except ConnectionResetError as e: print("err ", e) breakif __name__ == "__main__": HOST, PORT = "localhost", 9999 with socketserver.ThreadingTCPServer((HOST, PORT), MyTcpHandler) as server: server.serve_forever()
客户端
import socketclient = socket.socket()client.connect(('localhost', 9999))while True: msg = input(">>>").strip() if len(msg) ==0:continue client.send(msg.encode("utf-8")) data = client.recv(1024) print("recv:>",data.decode())client.close()
转载地址:https://blog.csdn.net/weixin_39934221/article/details/80599695 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年03月13日 14时11分41秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
mysql in 逗号分隔,使用MySQL IN()从逗号分隔的值中获取记录?
2019-04-21
php静态页面示例,php生成静态页面的简单示例_php实例
2019-04-21
迭代函数系统matlab实现,线性随机IFS迭代Matlab示例程序.doc
2019-04-21
c语言程序设计教程谭浩强张基温,C语言程序设计教程(第2版)
2019-04-21
exfat默认配置大小_mac开发配置技巧
2019-04-21
k8s边缘节点_边缘计算容器及K8S应用的三种场景及部署选项
2019-04-21
诸葛io的技术架构图_基于泳道技术生成“无数”个测试环境
2019-04-21
互相引用 spring_# 技术笔记:spring、springBoot源码解析
2019-04-21
华为发布岳云鹏手机_鸿蒙2.0正式发布:明年华为手机全面升级
2019-04-21
ifpc挖filecoin_Filecoin挖矿分析全套 不容错过的干货
2019-04-21
python扫雷 高级算法_Python玩转算法—扫雷
2019-04-21
牛客网python测试考试答案_牛客网SQL题库之考试分数
2019-04-21
git获取所有branch_使用jGit 通过gitUrl 获取Git的所有分支
2019-04-21
mysql like 数字结尾_重拾MySQL之正则表达式
2019-04-21
mysql 重置密码_mysql忘记密码如何重置密码,以及修改root密码的三种方法
2019-04-21