前情提要
一: tcp 和udp 的区别
# tcp # # 面向连接的 可靠的 全双工的 流式传输 # # 面向连接 :同一时刻只能和一个客户端通信 # # 三次握手、四次挥手 # # 可靠的 :数据不丢失、慢 # # 全双工 :能够双向通信 # # 流式传输 :粘包 无边界 # udp # 无连接的 面向数据包 不可靠的 快速的 # 无连接的 :不需要accept/connect 也没有握手 # 面向数据包的 :不会粘包 # 不可靠的 :没有自动回复的机制 # 快速的 :没有那些复杂的计算、保证数据传输的机制
二:udp 的简单示例
1:服务端
import socket sk=socket.socket(type=socket.SOCK_DGRAM) #默认是tcp 协议,需要更改type 类型, sk.bind(('127.0.0.1',9000)) #建立服务 msg ,addr =sk.recvfrom(1024) #每次大小 print(msg) print(addr) sk.sendto(b'world',addr) #内容,地址 sk.close()
2:客户端
import socket sk=socket.socket(type=socket.SOCK_DGRAM) sk.sendto(b'hello',('127.0.01',9000)) msg,addr =sk.recvfrom(1024) print(msg) sk.close()
三:udp实现多人聊天
1:服务端
import socket sk =socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9000)) #建立服务 while 1: msg ,addr =sk.recvfrom(1024) print(msg) connect =input('>>>>').encode() sk.sendto(connect,addr)
2:服务端
import socket sk =socket.socket(type=socket.SOCK_DGRAM) while 1: connect =input('>>>>>').encode() sk.sendto(connect,('127.0.0.1',9000)) msg ,addr =sk.recvfrom(1024) print(msg)
四:tcp 实现多并发解决聊天问题(并不是群发只是逐个解决)
1:服务端
import socketserver #soceket的进阶类 class Myserver(socketserver.BaseRequestHandler): #固定格式 def handle(self): conn =self.request while 1: conttent =input('>>>>>>>>>>>').encode() conn.send(conttent) server =socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver) server.serve_forever()
2客户端:
import socket sk =socket.socket() sk.connect(('127.0.0.1',9000)) while 1: ret =sk.recv(1024) print(ret) sk.close()
小作业:
# 1.完成一个在网络上对文件的传输(进阶需求 如果这个文件非常大 2个G)
# 1)完成文件的下载
# 2)把用户认证这个功能加上
# 必须先认证 再进行上传下载
# 3)文件的一致性校验
# 2.练习一些udp协议的操作
# 3.使用socketserver实现一个并发的基于tcp协议的多人聊天
上面作业等讲完整理