一.udp udp协议特点:无连接 快 不可靠 面向数据包的传输 只能发短消息 client: import json import socket server_addr = ('127.0.0.1',9090) sk = socket.socket(type=socket.SOCK_DGRAM) #指定类型为udp while True: msg = input('>>>') dic = {'msg':msg,'username':'client2'} send_msg = json.dumps(dic).encode('utf-8') sk.sendto(send_msg,server_addr) #发送消息 msg,server_addr = sk.recvfrom(1024) #接收消息 msg_dic = json.loads(msg.decode('utf-8')) print('消息来自%s: %s' % (msg_dic['username'],msg_dic['msg'])) sk.close() server: import json import socket

sk = socket.socket(type=socket.SOCK_DGRAM) #指定类型为udp sk.bind(('127.0.0.1',9090)) while True: msg,client_addr = sk.recvfrom(1024) #需先接受客户端的信息,无连接的 msg_dict = json.loads(msg.decode('utf-8')) print('消息来自%s : %s' %(msg_dict['username'],msg_dict['msg']))

   msg = input('>>>')
   dic = {'msg': msg,'username':'server'}
   send_msg = json.dumps(dic).encode('utf-8')
   sk.sendto(send_msg,client_addr)             #发送消息

sk.close()

二.socketserver socketserver可以同时和多个客户端通讯 server: import socketserver

class Myserver(socketserver.BaseRequestHandler): #定义一个类,继承BaseRequestHandler def handle(self): #必须定义一个handle方法 conn = self.request addr = self.client_address while True: conn.send(b'hello') print(conn.recv(1024),addr[1])

if name == 'main': server = socketserver.ThreadingTCPServer(('127.0.0.1',9090),Myserver) #实例化一个对象 server.serve_forever()

client: import socket sk = socket.socket() sk.connect(('127.0.0.1',9090))

while True: print(sk.recv(1024)) sk.send(b'bye') sk.close()

三.并发编程 进程:正在运行的程序,是计算机中资源分配的最小单位 同步:做完一件事情 再做另外一件事情 异步:做一件事情的时候 可以再做另一件事情 并行 : 并行是指两者同时执行 并发 : 并发是指资源有限的情况下,两者交替轮流使用资源 阻塞:recv sleep accept input recv recvfrom 非阻塞:没有阻塞的情况

multiprocessing模块: p.start():启动进程 p.run():进程启动时运行的方法 p.terminate():强制终止进程p p.is_alive():如果p仍然运行,返回True p.join([timeout]):主线程等待p终止 p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止

锁:同步控制,提高数据的安全性,效率会降低 lock.acquire() #使用锁 同一时间只有一个进程可以访问资源 lock.release() #释放锁

队列:实现多进程之间的数据传递 q.put(1) #在队列中放值 q.get() #在队列中取值 q.put_nowait( ) #如果q已满 再放值不阻塞 q.get_nowait( ) #如果q已空 再取值不阻塞 q.empty() #判断队列是否为空 返回布尔值 q.full() #判断队列是否已满,返回布尔值