if num==65536:
num = 0
# 判断这次接收到的数据的包编号是否是 上一次的包编号的下一个
# 如果是才会写入到文件中,否则不能写入(因为会重复)
if num == packetNum[0]:
# 把收到的数据写入到文件中
f.write(recvData[4:])
num = packetNum[0]
#整理ACK的数据包
ackData = https://www.isolves.com/it/cxkf/bk/2020-07-09/struct.pack("!HH", 4, packetNum[0])
udpSocket.sendto(ackData, serverInfo)
elif opNum[0] == 5:
print("sorry,没有这个文件....")
flag = False
# time.sleep(0.1)
if len(recvData)<516:
break
if flag == True:
f.close()
else:
os.unlink(downloadFileName)#如果没有要下载的文件,那么就需要把刚刚创建的文件进行删除
if __name__ == '__main__':
main()
十、UDP广播
UDP广播不是对每个用户轮流发送数据,而是发送到交换机,交换机负责同时发送给每个用户 。
广播可用于动态获取ip地址 。
单播----点对点;多播----一对多;广播----一无所有 。
注意:广播只用于UDP中,TCP不能广播!
python简单实现:
文章插图
十一、TCP服务器、客户端简介及实现
11.1 TCP简介
tcp:传输控制协议
特点:1、稳定;2、相对udp而言要慢一些;3、web服务器都是使用的tcp;
udp:用户数据包协议
特点:1、不稳定;2、相对tcp而言要快一些;
11.2 TCP和UDP通信模型
udp通信模型:相当于写信;
文章插图
tcp通信模型:相当于打电话;
socket创建出来的套接字,默认为主动套接字,即发送数据给别人 。listen()将主动套接字变为被动套接字 。
TCP服务器端:
1、买个手机 socket(xxx);
2、插入手机卡 bind(xxx);
3、设置手机为响铃模式 listen();
4、等待别人的电话,准备好接听 accept();
TCP客户端:
1、买个手机 socket(xxx);
2、拨打电话 connect(xxx);
文章插图
11.3 python实现tcp服务器和客户端
tcp服务器端实现(简单原理实现,非实际的多进程)如下:
注意:
accept用来接收客户端请求,并重新创建一个socket为新的客户服务,然后等待下一个客户端的请求 。
clientSocket用来专门为新的客户端服务 。
代码解释:
第一个while循环用来监听是否有新客户接入,并为它分配服务资源 。
第二个while循环为新的客户端服务 。注意:当客户端下线时,newSocket.recv(1024)这句可以解阻塞,且返回值为0,从而可以跳出循环 。
该程序为单任务,实际服务器为多进程实现,只需将第二个while定义为一个函数,在第一个while中启动一个进程执行该函数即可 。
#coding=utf-8
from socket import *
# 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
# 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address)
# 使?socket创建的套接字默认的属性是主动的,使?listen将其变为被动的,这样就可以接收 。
# 5表示服务器同一时刻最多允许5个客户端发数据
tcpSerSocket.listen(5)
while True:
# 如果有新的客户端来连接服务器,那么就产??个新的套接字专?为这个客户端服务器
# newSocket?来为这个客户端服务
# tcpSerSocket就可以省下来专?等待其他新客户端的链接
newSocket, clientAddr = tcpSerSocket.accept()
# 该循环为新的客户端服务 。注意:当客户端下线时,newSocket.recv(1024)这句可以解阻塞,且返回
# 值为0,从而可以跳出循环
while True:
# 接收对?发送过来的数据,最?接收1024个字节
recvData = https://www.isolves.com/it/cxkf/bk/2020-07-09/newSocket.recv(1024)
# 如果接收的数据的?度为0,则意味着客户端关闭了链接
if len(recvData)>0:
print 'recv:',recvData
else:
break
# 发送?些数据到客户端
sendData = https://www.isolves.com/it/cxkf/bk/2020-07-09/raw_input("send:")
newSocket.send(sendData)
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了
推荐阅读
- IPFS哪些地方比HTTP更具优势?IPFS凭什么能取代http协议?
- Windows下效率神器盘点——快速启动插件
- 2 人工智能——机器学习免费教程
- 百县千碗·余杭至味——2022云上年味@径山茶香满溢虎年大吉
- 店铺转让协议标准范本 店铺转让协议书简单
- 固态硬盘掉速修复小教程,SATA和NVMe协议通用
- 淘宝店铺过户合同模板 天猫转让合同协议书
- 渗透测试的新武器——Spyse网空搜索引擎
- C++高级编程之——函数重载、内联、缺省参数、隐式转换
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程