无连接的不可靠的服务用udp
1. 创建数据报套接字
2. 绑定本地IP和端口
3. 收发信息
recvfrom(BUFFERSIZE)
功能:在udp中接收消息
参数:buffersize表示一次最多可以接收到多少字节的消息
返回值:data接收到的消息,addr从哪个客户端接收到的消息
sendto(data,addr)
功能:向一个网络终端发送消息
参数:data要发送的消息(bytes),addr要发送对象的地址
4. 关闭套接字
udp客户端:
1. 创建数据报套接字
2. 消息收发
3. 关闭套接字
from socket import *
import sys
#从命令行传入IP和端口
HOST=sys.argv[1]
PORT=int(sys.argv[2])
ADDR=(HOST,PORT)
#创建数据报套接字
sockfd=socket(AF_INET,SOCK_DGRAM,)
#绑定本地IP和端口号
sockfd.bind(ADDR)
#接收消息
while True:
data,addr=sockfd.recvfrom(BUFFERSIZE)
print("recv from",addr,':',data.decode())
sockfd.sendto(("在%s 接收到你到消息"%ctime()).encode(),addr)
#关闭套接字
sockfd.close()
总结:tcp与udp区别
1. tcp有连接,udp无连接
2. tcp 有三次握手和四次挥手,udp无
3. tcp上以数据流传输数据,有粘包,udp是数据报形式没有粘包
4. tcp的连接需要消耗一定的资源,相比之下,udp资源消耗少
5. tcp保证数据的可靠性,udp无保证
6. tcp需要listen,accept,connect ,udp不需要这些操作
socket模块
套接字属性
getpeername()
功能:用作服务器连接套接字,查看连接的客户端地址
循环服务器模型,循环处理客户端的请求,处理完一个继续处理下一个
缺点:不能同时处理多个请求,不允许某个客户端长期占用服务器资源,
因为udp不需要进行连接,所以循环服务器模型更加适合udp通信。
并发服务器模型
每有一个客户端就创建一个 进程/现成处理客户端的具体请求事情,而主进程/主线程 继续接收其他客户端的连接
fork
1. 创建套接字 绑定 监听
2. 接收客户端连接请求 创建新的进程
3. 主进程继续接收下一个客户端连接请求,子进程处理客户端事件
4. 有客户端则关闭相应的子进程