网络编程小结
上周小回顾
1.加入通信循环,使客户端和服务端的可以相互发数据
2.加入连接循环,可以接收多个客户端的连接请求
3.执行ssh命令的小案例subprocess
subprocess这个模块是可以执行系统命令
4.粘包问题:就是发送的数据有的合并在了一起,具体情况是tcp这个协议的问题,tcp是流式协议,这个协议会有概率把时间间隔较短以及数据量较小的数据,一次性发送来节省资源
5.解决粘包问题:视频里面的方法太水了,对于粘包问题最常见且相对简便的方法是定长消息或消息边界标记
定长消息:就是给每条消息的长度固定一个特定的字节数,就是给消息长度加点限制
消息边界标记:简白点就是使用换行符\n或回车符等
6.基于socket的udp
发送:sendto
接收:recvfrom
7.udp协议的特点
可以发空(数据报协议,自带报头)
不需要建立连接(这也是会出现丢包的原因)
不会粘包
不可靠(客户端,服务端谁断开都不受影响)
8.socketserver的使用(并发)
这个方法最大的特殊点就是可以实现并发,什么是并发就是可以接受很多个客户端来发送数据
TCP的服务器
server = socketserver.ThreadingTCPServer(它就是TCP服务器本身)
server.server_forever()开启服务器并监听
写一个类,类里面重写handle,方法内能实现收发数据(并发起来)
UDP的服务器
server = socketserver.ThreadingUDPServer(它就是TCP服务器本身)
server.server_forever()开启服务器并监听(这步不能少去)
写一个类,类里面重写handle,方法内能实现收发数据(并发起来)
同时这两个服务器里面的self.request是不一样的
还有要想获得正确的客户端地址要用到self.client_address因为正确的IP地址和端口号被包装到了这里面
9.socketserver源码分析
ThreadingTCPServer里面的init替我们创建了socket、bind、listen这些方法
server.serve_forever():创建线程,建立连接,和处理通信的问题
10.socket和socketserver的区别点以及共同点
1.都是用于网络编程来创建服务器和客户端
2.都在python中提供了构建网络应用的功能
3.都支持不同类型的网络通信协议,如TCP和UDP
4.可以用于创建多线程或多进程的网络应用
区别点:
Socket(套数字):类似自助餐厅:需要自己挑选食材、烹煮食物等,有很大的自由度但是需要处理一切细节。
特点:高度自定义
Socketserver(网络服务框架):类似高级餐厅,提供了完整的用餐流程,只要坐下来、点餐等所有服务和细节都有对应的服务员安排好。
特点:易于使用
Socket提供了更多的自定义选项,适合处理特殊的情况,socketserver提供了一套流程,适合通常的情况。