当前位置: 代码迷 >> 综合 >> 《计算机网络自顶向下》Socket Lab1 Web Server Lab
  详细解决方案

《计算机网络自顶向下》Socket Lab1 Web Server Lab

热度:106   发布时间:2023-11-17 17:37:38.0

文章目录

    • 前引
    • Lab 1 Web Server Lab
      • Lab1 文档查阅(友情提供下载链接)
      • 准备helloworld.html 文件
      • 创建Socket 填写主干部分
      • Lab1 检验Lab实验成果


前引


哈哈哈 各位好 我已经好久好久没找过这种做Lab的感觉了
这次感觉真的做出来 看到效果还是挺开心的 哈哈

这个Socket编程是《计算机网络自顶向下》自带的Lab 一共好像是有六个 然后这本书里面还有Wireshark Lab 也是挺有趣的

哈哈 刚刚做了做 对HTTP协议和 信息的交互 网页的显示文字 又有了自己的理解了 哈哈哈 那废话少说 Lab1作为第一个入手实验 我们走着


Lab 1 Web Server Lab


Lab1 文档查阅(友情提供下载链接)


为了还是方便大家下载相关文档 我下面还是把下载链接贴出来吧
Pearson Computer Networking: a Top-Down Approach, 8th Edition

大家直接下载Python 3 Socket Programming即可 大概7MB


然后我们打开Webserver.pdf查看即可 因为我快速浏览的时候喜欢用中文翻译 然后我已经提前把文件全部都转成了docx格式了 然后我们点进去大致看一下

总结了一下 大致任务如下:
1、创建TCP 套接字服务器
2、别人从(浏览器)网页上面可以向你的服务器发起请求 获取请求文件

3、服务器解释并返回特定文件 如果没有 或者服务器不存在的话 即返回404 Not Found
4、服务器仅支持一个HTTP 请求 一直保持打开的状态

然后下面我把相关中文翻译放了出来 我们就一步一步走 一步步理清思绪 顺藤摸瓜做了

在这里插入图片描述


准备helloworld.html 文件


前提说一下 我刚开始也很懵比 怎么准备文件 我一个电脑怎么又不是服务器 怎么支持请求文件啊- - 我刚开始就是这样想的
之后我忽然灵机一动 我们不如先看看框架是怎么样的 我们反正任务也是把框架内的代码给填了即可

框架代码如下

#import socket module
from socket import *
import sys # In order to terminate the program
serverSocket = socket(AF_INET, SOCK_STREAM)
#Prepare a sever socket
#Fill in start
#Fill in end
while True:#Establish the connectionprint('Ready to serve...')connectionSocket, addr = #Fill in start #Fill in end try:message = #Fill in start #Fill in end filename = message.split()[1] f = open(filename[1:]) outputdata = #Fill in start #Fill in end #Send one HTTP header line into socket#Fill in start#Fill in end #Send the content of the requested file to the clientfor i in range(0, len(outputdata)): connectionSocket.send(outputdata[i].encode())connectionSocket.send("\r\n".encode())connectionSocket.close()except IOError:#Send response message for file not found#Fill in start #Fill in end#Close client socket#Fill in start#Fill in end 
serverSocket.close()
sys.exit()#Terminate the program after sending the corresponding data 

从这里我们其实大概还是能知道 就是HTTP 请求 文件我们需要自己准备 之后文件随机放到我们的电脑的一个位置 之后我们通过fileopen打开 返回即可 当然我们的文件里面不能仅仅是ascii码组成的字符串 那必须是html格式能显示出来的

但是我又没有学 于是我就去网上搜了一下怎么简单的写一个hello,world!html文件 链接如下

教你怎么用html写一个HelloWorld 百度知道作者:斌哥说Python
HTML 第一个 HelloWorld页面 CSDN博主:AkagiSenpai

然后就简单写了一个文件出来 如下:
我把它放到了路径D:/Love6 html/helloworld.html位置上了
这部分的工作就完成啦

<html>
<head><meta charset = 'utf-8'><title>Love6's hello page</title>
</head><body>Hello,World!
</body>

创建Socket 填写主干部分


这部分 我还是想了很久的 写一步试一下 并且在与TCP服务器连接上了之后 我在服务器这端 用print看看最后服务器接受到了什么
我这里就说几个地方 这几个地方理解了 基本上就完成了 之后就是一些格式+语法的问题了

1、例如 http://127.0.0.1:2333/helloworld.html 服务器接受到的信息就是最后的请求文件的/helloworld.html 其实每次访问服务器 都是在请求服务器的文件 比如看一段视频 或者看一张照片 后面的一大串都是你所请求的文件在服务器中的路径 相对路径或者绝对路径就是看服务器怎么选择了
2、在网络中的信息传输都是 字节流 在python中转字节流 常用的就是encode('utf-8') 字节流转字符串str(sentence,'utf-8')
3、HTTP 响应报文 格式的话 可以网上搜一下或者是看书 我反正之后加上的报文只有两个状态行 连接状态 我还以为必须要很多个 比如时间 传输时间长度 最后一次传输时间那些都要加 哈哈 这两个最基本的我发过去 信息还是传输过去了
4、由于不清楚什么原因 我的外网地址无法访问 别人也无法访问


那上面一些需要注意的地方我都写了 那就直接放代码咯

# import socket module
from socket import *
import sys  # In order to terminate the programserverSocket = socket(AF_INET, SOCK_STREAM)
serverPort   = 2333
serverSocket.bind(('0.0.0.0',serverPort))
serverSocket.listen(1)
while True:# Establish the connectionprint('Ready to serve...')connectionSocket, addr =  serverSocket.accept()try:message = str(connectionSocket.recv(1024),'utf-8')filename = message.split()[1]filepath = 'D:/Love6 html/'print(filepath+filename[1:])f = open(filepath+filename[1:],"r")outputdata = f.readlines()connectionSocket.send("HTTP/1.1 200 OK\r\n".encode('utf-8'))connectionSocket.send("Connection: close\r\n".encode('utf-8'))connectionSocket.send("\r\n".encode('utf-8'))for i in range(0, len(outputdata)):connectionSocket.send(outputdata[i].encode('utf-8'))connectionSocket.send("\r\n".encode('utf-8'))f.close()connectionSocket.close()except IOError:connectionSocket.send("HTTP/1.1 404 Not Found\r\n".encode('utf-8'))connectionSocket.send("Connection: close\r\n".encode('utf-8'))connectionSocket.send("\r\n".encode('utf-8'))connectionSocket.send("404 Not found Cant find such file ".encode('utf-8'))connectionSocket.send("{0:}".format(filename).encode('utf-8'))
serverSocket.close()
sys.exit()  # Terminate the program after sending the corresponding data

Lab1 检验Lab实验成果


在忙了两个多小时的从零开始的学习与调试后 终于来到了检验成果的时候了 当然我也是检验了结果无数次了 哈哈 那我们直接看下面的结果咯

192.168.101.50是我的本机电脑的私网IP 不清楚为什么公网IP连接不上 这个我们就在网络属性那里就查的到了 对于127.0.0.1一般是用来测试的 就是指的本机IP
最后一张图就是 获取nofile.html 当然没有 网页就返回了Cant find such file
当然这个字符串是我们设置的 不是网页自动返回的哈 哈哈 那看效果应该是完美完成了 那这个Lab就告一段落了 各位下个Lab见

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  相关解决方案