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:服务就绪。
250:请求动作正确完成(HELO、MAIL FROM、RCPT TO、QUIT指令执行成功会返回此信息,大小写均可)
235:认证通过。
221:正在处理。
354:开始发送邮件内容,提示以特殊行.结束邮件内容。
500:语法错误,命令不能识别。
552:中断处理。
每个命令都是以\r\n结尾的字符串,并且要encode,这个实验我失败了,等变强了再来做