基于UDP的套接字
udp是无连接的,先启动哪一端都不会报错
socket.SOCK_DGRAM 数据报协议
udp不会发送空数据,什么都不输入直接发送也会有报头发过去
服务端
import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080)) while True:
data,client_addr = server.recvfrom(1024)
print(data)
server.sendto(data.upper(),client_addr) 客户端
import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True:
msg = input('>>:')
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,server_addr = client.recvfrom(1024)
print(data)
socketserver模块
使用socketserver类实现基于tcp的并发编程
import socketserver class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
# 通信循环
while True:
try:
data = self.request.recv(1024)
if len(data) == 0: break
self.request.send(data.upper())
except ConnectionRefusedError:
break
self.request.close() if __name__ == '__main__':
s = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyHandler, bind_and_activate=True)
s.serve_forever() # 代表连接循环
# 循环建立连接,每建立一个连接就会启动一个线程(服务员),专门与刚刚建立好的连接做通信循环
使用socketserver类实现基于udp的并发编程
import socketserver class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
# 通信循环
print(self.__dict__)
print(self.client_address)
print(self.request) data = self.request[0]
print('客户消息', data)
self.request[1].sendto(data.upper(), self.client_address) if __name__ == '__main__':
s = socketserver.ThreadingUDPServer(('127.0.0.1', 8081), MyHandler)
s.serve_forever()
进程
1.什么是进程?
进程指的是一个正在运行的程序,或者说是程序的运行过程,即进程是一个抽象的概念
进程是起源于操作系统的,是操作系统最核心的概念,操作系统所有其他的概念都是围绕进程展开的
2.为何要进程?
并发
3.如何用进程?
开启进程的两种方式
操作系统原理
1.串行:一个任务完完整整地运行完毕后,才能运行下一个任务
2.并发:看起来多个任务是同时运行的即可,单核也可以实现并发
3.并行:真正意义上多个任务同时运行,只有多核才能实现并行
4.cpu的功能:cpu是用来做计算的,cpu是无法执行IO操作的,一旦遇到io操作,应该去执行别的任务
5.多道技术:
①空间上的复用==》多个进程共用一个内存条
②时间上的复用==》多个进程复用同一个cpu的时间
cpu遇到IO切换:可以提升效率
一个进程占用cpu时间过长也会切走:为了实现并发效果不得已而为之,反而会降低程序的执行效率