几种web服务器的比较
select版服务器
优点:跨平台
缺点:
单个进程能够监视的文件描述符的数量存在最大限制(1024)
轮询检测,效率较低
poll版服务器
优点:解决了套接字有上限的问题
缺点:轮询检测
epoll版服务器
优点:
没有1024的最大限制
事件通知机制,效率较高
2020.10.27 周二
看到师兄在WeChat群里说最近有部电影-金刚川特别好,所以今天和我的小可爱在万达广场的万达影院看了这部电影。
1953年,抗美援朝战争进入最终阶段,志愿军在那金城发动最后一场战役。然而要到达金城就要跨过眼前的这条江,志愿军物资装备匮乏,面对美军战斗机不断的对桥进行轰炸,他们唯一能做出回应的仅有两门高炮和为数不多的炮弹…一遍又一遍的轰炸,一遍又一遍的修桥…最终志愿军们搭了一个人桥跨过了眼前这条江。在影片中印象最深刻的是由张译饰演的张飞张排长;在一次与敌机的战斗中被打掉了一条胳膊,一条腿…他把三枚炮弹挂在脖子上,用木棍支撑着身体艰难的爬到高炮上准备迎接下轮的战斗;敌机来了,他用一只手,一只脚操作着原本三五个人完成发射的高炮,面对敌机的轰炸无所畏惧,最终击落敌机。最后说说可爱的中国人民志愿军,面对死亡他们无所畏惧,每一个人都不怕死,为了国家,为了人民,随时准牺牲;
电影一开始的时候,在幕布上看到金刚川-sacrifice,我很疑惑,为什么翻译为sacrifice,但看完整个影片,我找到了答案,为了过江,为了保卫祖国安全,让中国人民过上安宁的日子,他们时刻准备好了牺牲,准备好了面对死亡。
在浏览器的地址输入栏,输入www.baidu.com访问百度。
#coding=utf-8
from socket import *
# 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
# 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcpSerSocket.listen(5)
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器
# newSocket用来为这个客户端服务
# tcpSerSocket就可以省下来专门等待其他新客户端的链接
newSocket, clientAddr = tcpSerSocket.accept()
# 接收对方发送过来的数据,最大接收1024个字节
recvData = newSocket.recv(1024)
print('接收到的数据为:%s'%recvData)
# 发送一些数据到客户端
newSocket.send("thank you !")
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
newSocket.close()
# 关闭监听套接字,只要这个套接字关闭了,就意味着整个程序不能再接收任何新的客户端的连接
tcpSerSocket.close()
import struct
from socket import *
import time
import os
def main():
#0. 获取要下载的文件名字:
downloadFileName = raw_input("请输入要下载的文件名:")
#1.创建socket
udpSocket = socket(AF_INET, SOCK_DGRAM)
requestFileData = struct.pack("!H%dsb5sb"%len(downloadFileName), 1, downloadFileName, 0, "octet", 0)
#2. 发送下载文件的请求
udpSocket.sendto(requestFileData, ("192.168.119.215", 69))
flag = True #表示能够下载数据,即不擅长,如果是false那么就删除
num = 0
f = open(downloadFileName, "w")
while True:
#3. 接收服务发送回来的应答数据
responseData = udpSocket.recvfrom(1024)
# print(responseData)
recvData, serverInfo = responseData
opNum = struct.unpack("!H", recvData[:2])
packetNum = struct.unpack("!H", recvData[2:4])
print(packetNum[0])
# print("opNum=%d"%opNum)
# print(opNum)
# if 如果服务器发送过来的是文件的内容的话:
if opNum[0] == 3: #因为opNum此时是一个元组(3,),所以需要使用下标来提取某个数据
#计算出这次应该接收到的文件的序号值,应该是上一次接收到的值的基础上+1
num = num + 1
# 如果一个下载的文件特别大,即接收到的数据包编号超过了2个字节的大小
# 那么会从0继续开始,所以这里需要判断,如果超过了65535 那么就改为0
if num==65536:
num = 0
# 判断这次接收到的数据的包编号是否是 上一次的包编号的下一个
# 如果是才会写入到文件中,否则不能写入(因为会重复)
if num == packetNum[0]:
# 把收到的数据写入到文件中
f.write(recvData[4:])
num = packetNum[0]
#整理ACK的数据包
ackData = 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()