import socket serverSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) serverPort=6789 serverSocket.bind(('',serverPort)) serverSocket.listen(1) while True: print('ready to server') connectionSocket,addr=serverSocket.accept() try: message=connectionSocket.recv(1024) filename=message.split()[1] f=open(filename[1:]) outputData=f.readlines() connectionSocket.send('HTTP/1.1 200 OK\r\n\r\n') for i in range(0,len(outputData)): connectionSocket.send(outputData[i].encode()) connectionSocket.close() except IOError: connectionSocket.send('404'.encode()) connectionSocket.close() serverSocket.close()
message是你的浏览器请求的,是http请求,split默认以空格分格,split后得到一个list,第一个是get,第二个是/hello.html,所以只要从下标1开始就可以得到请求的文件名
还有很重要的一点,只要在自己电脑上用127.0.0.1:端口号/文件名 就可以了,不用管互联网,因为我不会,以后学到再说吧
第二题:udpping
import random from socket import * serverSocket = socket(AF_INET, SOCK_DGRAM)#建立udp协议的socket连接 serverSocket.bind(('', 12000)) while True: rand = random.randint(0, 10)#生成随机数,模拟udp环境下的丢包 message, address = serverSocket.recvfrom(1024)#接收客户端发送的信息,应该传送ip地址比较好 message = message.upper() if rand < 4: continue#如果随机数字小于4那么就模拟丢包,不进行回复 serverSocket.sendto(message, address)
from socket import * import time HOST = 'localhost' PORT = 12000 clientSocket = socket(AF_INET, SOCK_DGRAM)#使用udp协议 for i in range(0,10):#发出十次ping try: start_time = time.time()#从发出报文开始计时 clientSocket.sendto('A'.encode(),(HOST, PORT))#发送报文给服务器 clientSocket.settimeout(1.0)#设置socket等待时间 message, address = clientSocket.recvfrom(1024)#recvfrom设置了一秒的时间限制 end_time = time.time()#结束时间 print ("Ping %d %f"%(i, end_time-start_time))#得到ttl,并显示出来 except timeout:#如果超过时间,抛出一个timeout的错误 print ("Resquest time out" )
第三题;
220:服务就绪。
扫描二维码关注公众号,回复:
1638992 查看本文章
250:请求动作正确完成(HELO、MAIL FROM、RCPT TO、QUIT指令执行成功会返回此信息,大小写均可)
235:认证通过。
221:正在处理。
354:开始发送邮件内容,提示以特殊行.结束邮件内容。
500:语法错误,命令不能识别。
552:中断处理。
每个命令都是以\r\n结尾的字符串,并且要encode,这个实验我失败了,等变强了再来做