计算机网络(自顶向下方法)学习记录---2.7 模拟HTTP协议套接字编程


前言

本次实验是在计算机网络(自顶向下方法)原书第七版的第二章课后练习实验的第一题。使用编程语言: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语言都可以编程,如果没有服务器的可以按照我的这个方法进行操作体验一下,如果有服务器的哈哈哈那就考虑理想化的实验吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计网菜包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值