9月27日学习内容整理:基于UDP协议的socket,并发编程的理论基础
一、UDP的socket
1、udp是无连接的,也不需要回应包,比TCP效率高,但数据可能不可靠
注意udp可以真正做到稳定正确传输的只到512字节
2、程序
服务端仍需要绑定IP和端口,但是不需要监听和接受连接,客户端也不需要建立连接(connect)
客户端发送时命令变为 : sendto(消息,(服务端的IP,端口号)) 意思是往哪发
重要重要重要:::::注意发送的是整个元组,必须先传消息,再传服务端的IP和port
服务端接受时命令变为 : ret=recvfrom(字节数) 这里的ret 就是发送传过来的整个元组,第一个元素就是消息,而第二个元素就变成了客户端的IP和port
服务端再发送时命令为: sendto(要返回的消息,ret[1]) 这里的ret[1] 就是往客户端的IP和port发
客户端再接受是命令:recvfrom(字节数) 同样的这里就会收到服务端传来的整个元组,第一个元素是返回的消息,第二个元素就变成了服务端的IP和port
3、启动顺序:udp没有固定的启动顺序,但是如果先启动客户端,传递的数据就有可能丢失,所以一般还是先启动服务端
4、udp是没有粘包现象的:udp可以主动包装数据头部,不用人为的去包装
若接收量比实际数据量小,那么剩余的数据就会被丢弃,不会像tcp那样会暂时放在内存中
服务端:
from socket import * import os print(os.getpid()) server=socket(AF_INET,SOCK_DGRAM) server.bind(('127.0.0.1',8080)) while True: data,client_addr=server.recvfrom(1024) server.sendto(data.upper(),client_addr) server.close()
客户端:
from socket import * client=socket(AF_INET,SOCK_DGRAM) while True: client.sendto(b'hello',('127.0.0.1',8082)) data,server_addr=client.recvfrom(1024) print(data.decode('utf-8'))
二、并发编程的理论基础
1、进程:就是指正在运行的程序。进程是操作系统的核心概念
2、操作系统的作用
(1)概念:本质上也是软件,是用来管理控制计算机硬件资源和软件资源的控制程序
(2)组成:内核态:处理硬件资源
用户态:为用户提供多种接口来使用系统的功能
(3)作用:为应用程序提供良好的调用硬件资源的接口
将应用程序对硬件的竞争变得有序化
3、多道技术
(1)由来:为了解决多个应用程序对统一资源竞争的有序调度问题(针对单核,实现并发)
补充:现在的主机一般都是多核,当一个应用程序被重新调度时操作系统会给它分配其中一个cpu继续运行
(2)解决办法:多路复用,包括空间复用和时间复用
空间复用:多个程序同时占用内存,但是每个程序之间一定要分割相互独立(硬件方面解决),否则程序和程序内存之间可以相互影响这样是很不安全不稳定的
时间复用:多个程序复用一个cpu时间片,当某个程序等待输入输出时或者运行时间过长(这个时间由操作系统说了算),cpu会切到另一个程序继续执行,若这个程序也遇到等待输入输出或者时间过长,cpu同样会切到另一个程序执行,等到某一程序完成输入输出cpu就会切到这个程序继续执行。以此类推
因为cpu切换的时间非常非常短,用户是很难感知到的,所以使用者实际上是觉得多个程序是并行的,同时执行的