课后——socket编程(多线程Web代理服务器)"/>
计算机网络课后——socket编程(多线程Web代理服务器)
计网课后编程作业
多线程Web代理服务器
在这个编程作业中,你将研发一个简单的Web代理服务器。当你的代理服务器从一个浏览器接收到对某对象的HTTP请求,它生成对相同对象的一个新HTTP请求并向初始服务器发送。当该代理从初始服务器接收到具有该对象的HTTP响应时,它生成一个包括该对象的新HTTP响应,并发送给该客户。这个代理将是多线程的,使其在相同时间能够处理多个请求。
对本作业而言,配套Web网站对该代理服务器提供了框架代码。你的任务是完善该代码,然后测试你的代理,方法是让不同的浏览器经过你的代理来请求Web对象。
备注
测试过滴😜阔以运行哒~~
下面奉上源码:
源码
ProxyServer
from socket import *
import sys
import os# if len(sys.argv) <= 1:
# print ('Usage : "python ProxyServer.py server_ip"\n[server_ip : It is the IP Address Of Proxy Server')
# sys.exit(2)# 为代理服务器 创建一个TCP套接字、绑定端口号、设置服务器最大连接客户机数量为3(因为是多线程Web服务器)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(('', 1234))
tcpSerSock.listen(3)while 1:# 准备从客户机接收响应消息print('准备从客户机接收响应消息...')tcpCliSock, addr = tcpSerSock.accept()print('接收到一个连接,来自:', addr)# 获取客户机发送过来的消息message = tcpCliSock.recv(4096).decode()print('客户机发送过来的消息:', message)# 从消息从提取出文件名filename = message.split()[1].partition("//")[2].replace('/', '_')print('文件名:', filename)fileExist = "false"try:# 检查要访问的文件是否在此Web代理服务器中print('开始检查代理服务器中是否存在文件:', filename)f = open(filename, "r")outputdata = f.readlines()fileExist = "true"print('文件存在在代理服务器中')# 文件存在在代理服务器中,返回响应消息(请求的web网页)给客户机# tcpCliSock.send("HTTP/1.0 200 OK\r\n")# tcpCliSock.send("Content-Type:text/html\r\n")for i in range(0, len(outputdata)):tcpCliSock.send(outputdata[i].encode())print('Read from cache')# 文件不在代理服务器当中,代理服务器就会向远端服务器请求消息,保存好了再返回给客户机except IOError:if fileExist == "false":print('文件不在代理服务器当中,开始向远端服务器请求网页')# 在代理服务器中创建一个TCP套接字c = socket(AF_INET, SOCK_STREAM)hostn = message.split()[1].partition("//")[2].partition("/")[0]print('Host Name: ', hostn)try:# TCP套接字c 连接到远端服务器80端口c.connect((hostn, 80))print('套接字连接到主机的80号端口')# 在套接字上创建一个临时的文件,而且要向80端口(远端服务器)请求信息# for the file requested by the client# fileobj = c.makefile('r', 0)# fileobj.write("GET "+"http://" + filename + " HTTP/1.0\n\n")# 代理服务器 读取 从远端服务器从响应的消息c.sendall(message.encode())buff = c.recv(4096)tcpCliSock.sendall(buff)# 在代理服务器中 创建一个新的文件 用于存放请求过来的消息# 将代理服务器中的响应 发送到客户端套接字,并将相应的文件发送到缓存中tmpFile = open("./" + filename, "w")tmpFile.writelines(buff.decode().replace('\r\n', '\n'))tmpFile.close();except:print("代理服务器向远端服务器请求网页失败")else:# 如果客户机请求的消息在远端服务器也找不到,就说明请求不到了print('文件存在,但是还是出现了 IOError异常')# 关闭客户机 和 代理服务器的TCP套接字print('关闭套接字:tcpCliSock')tcpCliSock.close();
# 关闭代理服务器 和 服务器的TCP套接字
print('关闭套接字:tcpSerSock')
tcpSerSock.close();
更多推荐
计算机网络课后——socket编程(多线程Web代理服务器)
发布评论