zoukankan      html  css  js  c++  java
  • 计算机网络自顶向下之应用层套接字编程作业Web服务器

    套接字编程作业1:Web服务器

    官方英文文档:Socket1_WebServer.pdf

    以下内容为笔者翻译:


    套接字编程作业1:Web服务器

    在本实验中,您将学习Python中TCP连接的套接字编程的基础知识:如何创建套接字,将其绑定到特定的地址和端口,以及发送和接收HTTP数据包。您还将学习一些HTTP首部格式的基础知识。

    您将开发一个处理一个HTTP请求的Web服务器。您的Web服务器应该接受并解析HTTP请求,然后从服务器的文件系统获取所请求的文件,创建一个由响应文件组成的HTTP响应消息,前面是首部行,然后将响应直接发送给客户端。如果请求的文件不存在于服务器中,则服务器应该向客户端发送“404 Not Found”差错报文。

    代码

    在文件下面你会找到Web服务器的代码框架。您需要填写这个代码。而且需要在标有#Fill in start 和 # Fill in end的地方填写代码。另外,每个地方都可能需要不止一行代码。

    运行服务器

    将HTML文件(例如HelloWorld.html)放在服务器所在的目录中。运行服务器程序。确认运行服务器的主机的IP地址(例如128.238.251.26)。从另一个主机,打开浏览器并提供相应的URL。例如:

    http://128.238.251.26:6789/HelloWorld.html

    “HelloWorld.html”是您放在服务器目录中的文件。还要注意使用冒号后的端口号。您需要使用服务器代码中使用的端口号来替换此端口号。在上面的例子中,我们使用了端口号6789. 浏览器应该显示HelloWorld.html的内容。如果省略“:6789”,浏览器将使用默认端口80,只有当您的服务器正在端口80监听时,才会从服务器获取网页。

    然后用客户端尝试获取服务器上不存在的文件。你应该会得到一个“404 Not Found”消息。

    需要上交的内容

    您需要上交完整的服务器代码,以及客户端浏览器的屏幕截图,用于验证您是否从服务器实际接收到HTML文件内容。

    Web服务器的Python代码框架

    #import socket module
    from socket import *
    serverSocket = socket(AF_INET, SOCK_STREAM) 
    #Prepare a sever socket 
    #Fill in start 
    #Fill in end 
    while True:     
        #Establish the connection    
        print '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 client
            for i in range(0, len(outputdata)):
                connectionSocket.send(outputdata[i])
            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()
    

    别人的代码 ,可以尝试用电脑运行,然后在手机浏览器访问

    # import socket module
    from socket import *                                   
    serverSocket = socket(AF_INET, SOCK_STREAM) 
    # Prepare a sever socket
    serverSocket.bind(('', 6789))
    serverSocket.listen(1)
    
    while True: 
        # Establish the connection
        print('Ready to serve...')
        connectionSocket, addr = serverSocket.accept()            
        try: 
            message = connectionSocket.recv(1024)  # Fill in start          #Fill in end
            filename = message.split()[1]                  
            f = open(filename[1:])                         
            outputdata = f.read()
                       
            # Send one HTTP header line into socket
            header = ' HTTP/1.1 200 OK
    Connection: close
    Content-Type: text/html
    Content-Length: %d
    
    ' % (len(outputdata))
            connectionSocket.send(header.encode())
                        
            # Send the content of the requested file to the client
            for i in range(0, len(outputdata)):            
                 connectionSocket.send(outputdata[i].encode())
            connectionSocket.close() 
        except IOError: 
            #Send response message for file not found 
            header = ' HTTP/1.1 404 Not Found'   
            connectionSocket.send(header.encode())
            connectionSocket.close()
            #Fill in start 
            #Fill in end  
    serverSocket.close()  
    

    在这里插入图片描述
    待我一一解释 浏览器端110.64.89.227 服务器端 172.21.199.156

    • 前四个灰色的是小的TCP报文段不含数据,所以用灰色表示
      • 前俩个是我用另一台电脑的浏览器发出的请求,发起TCP连接
      • 后两个是服务器响应报文是第二次握手
    • 第五第六是第三次握手,淡紫色可以携带数据比如这里通过TCP连接发送一个HTTP 请求报文
    • 后面 三个谈绿色的HTTP应该是应用层HTTP报文的交互 不太了解 我强行解释一下:
      • 第一个应该是HTTP请求报文
      • 第二个第三个应该是说明服务器还再传送数据,别关掉
    • 然后是三个TCP报文 传输数据 主要看顺序字seq和ack的变化
    • 又来一个HTTPGET的报文,因为已经握手过了,直接发一个类似第三次握手的HTTP请求报文即可.
    • 然后5个TCP报文传输数据
    • 值得说一下,我好像看不到HTTP响应报文,应该是没有这个操作了,因为我只发送了一个HTML文件

    可选练习

    1. 目前,这个Web服务器一次只处理一个HTTP请求。请实现一个能够同时处理多个请求的多线程服务器。使用线程,首先创建一个主线程,在固定端口监听客户端请求。当从客户端收到TCP连接请求时,它将通过另一个端口建立TCP连接,并在另外的单独线程中为客户端请求提供服务。这样在每个请求/响应对的独立线程中将有一个独立的TCP连接。

    2. 不使用浏览器,编写自己的HTTP客户端来测试你的服务器。您的客户端将使用一个TCP连接用于连接到服务器,向服务器发送HTTP请求,并将服务器响应显示出来。您可以假定发送的HTTP请求将使用GET方法。
      客户端应使用命令行参数指定服务器IP地址或主机名,服务器正在监听的端口,以及被请求对象在服务器上的路径。以下是运行客户端的输入命令格式。

      client.py server_host server_port filename

  • 相关阅读:
    Heapsort 堆排序算法详解(Java实现)
    GIve Me A Welcome Hug!
    linux系统救援模式拯救mv libc.so.6文件后无法使用命令的悲剧
    RabbitMQ集群部署
    使用Xshell通过堡垒机登录服务器
    dubbo + zookeeper环境部署
    zookeeper集群部署
    zabbix-3.0.1 添加微信报警
    zabbix-3.0.1结合grafana绘图
    Centos7.2安装zabbix3.0.1简要
  • 原文地址:https://www.cnblogs.com/most-silence/p/15495335.html
Copyright © 2011-2022 走看看