前言
本次实验是在计算机网络(自顶向下方法)原书第七版的第二章课后练习实验的第一题。使用编程语言:Python 编程环境:Pycharm 客户端:本电脑 服务端:本电脑。
注意:理想的编程客户端应该是本机,服务端是服务器,将编译好的服务端程序放置在服务器上,所需要查询的界面也放在服务器上的指定路径下,在客户端浏览器网址页面输入你所需要的页面URL,因为博主实验环境受限,故使用一台电脑模拟两个端交互。在结尾处我会对理想化的实验做一个解释。
一、Web服务器编程
代码如下:
from socket import * #套接字接口包
import os #python的文件管理包
ServerPort = 48000 #服务器端口号
serverName = "C:/Users/15051/PycharmProjects/pythonProject3"#因为是本地的所以需要模拟具体的路径,在最后一节我会讲到。
ServerSocket = socket(AF_INET, SOCK_STREAM) #套接字类型(ipv4连接,TCP)
ServerSocket.bind(('', ServerPort)) #端口绑定套接字端口
ServerSocket.listen(1) #欢迎套接字监听连接服务
print("The Server Is Already")
def HttpExplain(Message): #创建服务器解析客户端请求报文
Data = Message.decode()
print(Data)
LMessage = Data.split("\n")#按指定格式分割接收到的报文
URL = LMessage[0].split(" ")
fileName = URL[1].split("/")[1]
return fileName
def searshFile(fileName):
path = serverName + "/" + fileName #查询文件的URL
if fileName in os.listdir(serverName):#查询文件是否存在
with open(path,'r',encoding="utf-8") as fp:
data = fp.read()
HTTPResponse = "HTTP/1.1 200 ok\r\n\r\n" + data
else: #不存在显示404页面
HTTPResponse = "HTTP/1.1 404 \r\n\r\n<h1>404 Not Found</h1>"#传输回去的字节一切都由浏览器编码进行显示
return HTTPResponse.encode()
while True: #服务器一直运行
connectionSocket, addr = ServerSocket.accept() #创建连接套接字
message = connectionSocket.recv(2048) #接受连接套接字信息
fileName = HttpExplain(message)
res = searshFile(fileName)
connectionSocket.send(res)
connectionSocket.close() #关闭连接套接字
上述代码中与前一节2.7节TCP/UDP编程中提到过具体解释,详情请见前一个博客,与前一节不同的内容是新增了两个函数:HttpExplain(Message)、searshFile(fileName)。HttpExplain(Message)函数的作用是,接收到客户端传送过来的请求报文,并将其解析取出客户端想要的文件名,并作为返回值。searshFile(fileName)函数的作用是,查询HttpExplain(Message)函数返回的取出的文件名,并在服务器上查询该文件,查询到了就返回该文件的字节,未查询到返回404页面。
二、Web客户编程
代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
from socket import *
serverName = "服务器主机名"
serverPort = 48000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
message = "GET /index1.html HTTP/1.1"#模拟浏览器发送请求报文
clientSocket.send(message.encode())
modifiedMessage = clientSocket.recv(2048)
print("The modified message is:", modifiedMessage.decode())
clientSocket.close()
上述代码中也与前一节中的TCP客户端代码没有大的差别,差别只是将发送的请求报文(这里是message)改变了,我这里请求的是index1.html的文件,该文件我放在了。
三、结果
上图是服务器的接收到的两个,客户端发送的请求,分别是index.html文件与index1.html文件,这里我设置的是index.htm文件存在,并没有编写index1.html文件。
由上图可以看到,index.html文件的字节被传送回来到客户端界面,前提是该文件存在。
而index1.html文件并不存在,故这里客户端收到的文件即为404notfound字节。
四、理想实验
这里讲述一下该实验的理想实验做法,在服务器编程中要设置一个服务器的IP地址,serverhost = “x.x.x.x”就是你自己部署的服务器的地址,原来文件中的serverName不需要,searshFile(fileName)函数中的path地址是“webserver\” + fileName。而客户端的编程是不需要的,一切客户端的发送请求报文都是由浏览器进行的,如下图:
在服务器上将书写好的index.html代码文件保存在webserver(或者自己创建的文件名)文件下,在客户的浏览器上输入服务器的IP地址/index.html 如果服务器上存在index.html文件,则浏览器会显示该文件的页面,如果查询不到就显示404的页面。
总结
本章到这里就结束了,只是一个小的实验让我们明白web客户端请求服务器上的网络页面具体是怎么运行的,当然Java和c语言都可以编程,如果没有服务器的可以按照我的这个方法进行操作体验一下,如果有服务器的哈哈哈那就考虑理想化的实验吧。