我与python约个会:30.4. 企业级开发进阶2.4:服务端快捷开发
来源:互联网 发布:知り合いです 编辑:程序博客网 时间:2024/06/07 01:40
前面的内容中已经介绍了TCP编程和UDP编程实现网络数据的通信和共享
我们可以看到客户端程序的编写相对容易,主需要连接服务端然后跟服务端进行数据交互就OK了。但是服务端的程序编写较为复杂,如果考虑到数据的并发处理等各种问题,就更加复杂难以操作了。
python提供了一个socketserver模块,可以用于更加快捷的构建我们需要的服务端环境
本节内容
- socketserver模块简介
- 常规模式服务端编程
- 并发模式服务端编程
1. socketserver模块简介
socketserver是什么?
socketserver模块时python提供的内置的用于快捷开发服务端程序的一个服务器框架,通过封装大量实现的方式减少开发人员工作量的同时能快捷开发出具有较高质量的服务端程序。socketserver中提供了什么?
socketserver模块主要包含的服务器类:TCPserver、UCPserver、ThreadingTCPserver、ThreadingUDPserver、ForkingTCPserver、ForkingUDPserver
注意:上述TCP表示TCP服务端编程需要的服务类,UDP表示UDP编程需要的服务类,包含Threading的表示多线程并发需要的服务类;包含Forking的表示多进程并发需要的服务类
关于多线程和多进程,后面的章节中会详细介绍socketserver核心操作?
socketserver框架中,服务端的处理类主要有StreamRequestHandler(基于TCP协议的)、DatagramRequestHandler(基于UDP协议的),处理类中非常重要的一个方法headler()
用来执行服务端程序中的核心操作class mytcpserver(socketserver.StreamRequestHandler): def handle(self): # 服务器中的核心操作代码
socketserver中的结构?
socketserver中主要包含两部分:服务器和处理类
服务类就是socketserver提供了内置服务类,如TCPserver、UDPserver
等等
处理类就是我们自定义的处理类,处理类中会包含handle()方法用于业务处理
2. 服务端编程
2.1. TCP服务端编程
使用socketserver编写服务端程序如下:
import socketserver# 自定义处理类class myTcp(socketserver.StreamRequestHandler): # 定义处理方法 def handle(self): # 通过client_address属性查看连接进来的服务器 print("连接上的服务器:%s" % str(self.client_address)) while True: # 接收客户端发送的数据 msg = self.request.recv(1024) if not msg: break; print("客户端发过来消息:%s" % msg.decode("UTF-8")) # 给客户端返回接收信息 self.request.sendall("已经成功接收您发送的消息".encode("UTF-8"))# 程序从主线程直接运行if __name__ == "__main__": # 创建服务端对象,指定处理类,并监听8888端口 server = socketserver.TCPServer(('', 8888), myTcp) # 启动服务端程序 server.serve_forever()
此时,我们使用常规模式开发客户端程序如下:
import socketsc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sc.connect(("192.168.10.108", 8888))while True: msg = input("请输入要发送的内容:") if not msg or msg == "exit": break sc.sendall(msg.encode("UTF-8")) msg = sc.recv(1024) print("服务器回应:" + msg.decode("UTF-8"))sc.close()
运行上述程序,就可以和之前一样,实现客户端和服务端之间的数据通信了;
和以前不一样的时,此时我们如果关闭了客户端,服务端程序还是在运行的,如果重新启动客户端,客户端又会接入服务端,重新建立连接并通信。
2.2. UDP服务端编程
使用socketserver的UDPServer服务类和DatagramRequestHandler处理类进行服务端的编程处理如下:
import socketserver# 创建自定义处理类class myUdp(socketserver.DatagramRequestHandler): # 创建自定义处理方法 def handle(self): # 打印连接进来的客户端信息 print("连接到服务器的主机:" + str(self.client_address)) # 收发消息 while True: # 接收客户端发送的消息 # msg = self.request.recv() msg = self.rfile.readline() if not msg: break print("接受到客户端发送的消息:%s" % msg.decode("UTF-8")) # 发送消息 self.wfile.write("接收到您发送的消息".encode("UTF-8"))# 主模块线程中运行程序if __name__ == "__main__": # 创建UDP服务器对象 server = socketserver.UDPServer(("", 8989), myUdp) # 启动UDP服务器 server.serve_forever()
使用常规的方式开发UDP客户端代码如下:
import socketsc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)while True: data = input("请输入要发送的消息:") if not data or data == "exit": break sc.sendto(data.encode("UTF-8"), ("192.168.10.108", 8989)) data,recv = sc.recvfrom(1024) if not data: break print("服务器返回消息:" + data.decode("UTF-8"))sc.close()
此时启动服务端程序,启动客户端程序,就可以实现服务端和客户端时间的数据通信了。
另外:你可以试试启动多个客户端程序看看,有彩蛋哦。
3. 服务端并发
关于使用多线程或者多进程并发的方式也是比较简单的,参考代码如下,如果有兴趣的话,等学习完并发编程之后,可以再回过头看看ThreadingTCPServer和ForkingTCPServer这样多线程和多进程并发的操作哦
服务端参考代码:
import socketserverclass myTcp(socketserver.StreamRequestHandler): def handle(self): while True: data = self.request.recv(1024) print("接收到数据:" + data.decode("UTF-8")) self.request.sendall("数据已经接收成功".encode("UTF-8"))if __name__ == "__main__": server = socketserver.ThreadingTCPServer(("", 9000), myTcp) server.serve_forever()
客户端还是常规的客户端
import socketsc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sc.connect(("192.168.10.108", 9000))while True: msg = input("请输入要发送的内容:") if not msg or msg == "exit": break sc.sendall(msg.encode("UTF-8")) msg = sc.recv(1024) print("服务器回应:" + msg.decode("UTF-8"))sc.close()
- 我与python约个会:30.4. 企业级开发进阶2.4:服务端快捷开发
- 我与python约个会:29.企业级开发进阶1:文件输入输出流[IO操作]
- 我与python约个会:30.企业级开发进阶2:网络编程
- 我与python约个会:30.1. 企业级开发进阶2.1:TCP编程
- 我与python约个会:30.2. 企业级开发进阶2.2:TCP实战
- 我与python约个会:30.3. 企业级开发进阶2.3:UDP编程
- 我与python约个会:31.企业级开发进阶3.1:发送电子邮件
- 我与python约个会:31.2企业级开发进阶3.2:接收电子邮件
- 我与python约个会:32.企业级开发进阶4:正则表达式
- 我与python约个会:33.企业级开发进阶6:数据库操作
- 我与python约个会:20. 企业级开发基础1:自定义模块
- 我与python约个会:21. 企业级开发基础2:使用第三方模块
- 我与python约个会:22.企业级开发基础3:类和对象
- 我与python约个会:24. 企业级开发基础5:面向对象特征(封装)
- 我与python约个会:23. 企业级开发基础4:面向对象
- 我与python约个会:25. 企业级开发基础6:面向对象特征(继承)
- 我与python约个会:26. 企业级开发基础7:面向对象特征(多态)
- 我与python约个会:27. 企业级开发基础8:面向对象扩展
- java程序运行机制
- 我与python约个会:30.3. 企业级开发进阶2.3:UDP编程
- [Windows驱动开发](四)内存管理
- 非manacher算法的最长回文串算法
- Vue-cli proxyTable 解决开发环境的跨域问题
- 我与python约个会:30.4. 企业级开发进阶2.4:服务端快捷开发
- React Native之RCTDeviceEventEmitter发送通知emit和监听接收addListener的用法
- 将工程push到github
- SDN控制器之OVN实验三:从OVN虚拟网络访问物理网络
- 我与python约个会:31.企业级开发进阶3.1:发送电子邮件
- 常用正则片段代码
- bootstrap-datepicker时间插件和chosen.jquery下拉模糊搜索和bootbox.min弹出框以及jquery.tips提示框和js的全选与取消的使用
- iOS接入支付宝支付
- web项目发布至tomcat的ROOT下方法(开发环境和部署环境)