计算机网络 自顶向下 套接字编程作业一

这是自顶向下中套接字的作业一,最近才看完谢希仁的计网,来做做自顶向下的实验。

https://zhuanlan.zhihu.com/p/34880601,这是一个大佬的笔记,只能膜,下面是我的代码,网上类似的有很多,我在这里记个笔记好了,方便以后复习

# import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
# Prepare a sever socket
serverSocket.bind(('', 6789))  # 将TCP欢迎套接字绑定到指定端口
serverSocket.listen(1)  # 最大连接数为1
while True:
    # Establish the connection
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept()  # 接收到客户连接请求后,建立新的TCP连接套接字
    try:
        message = connectionSocket.recv(1024)  # 获取客户发送的报文
        filename = message.split()[1]
        f = open(filename[1:])
        outputdata = f.read();
        # Send one HTTP header line into socket
        header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (
            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 Found'
        connectionSocket.send(header.encode())
        # Close client socket
        connectionSocket.close()
serverSocket.close()

这个作业主要是填充代码,将一个简单的web服务器的代码补全,能将本地的html文件通过tcp传输给其他主机

计算机网络 自顶向下 套接字编程作业一_第1张图片

这是整个传输的过程图

 

首先得去看一下python的socket模板,地址为--->https://docs.python.org/3/library/socket.html#module-socket因为英文版的我不太能完全看完,但是大概知道每个参数是啥就行

这是python wiki里面的一个tcp传输的 c/s模型 例子  https://wiki.python.org/moin/TcpCommunication

 

贴一个详细的中文版python socket编程常用方法 https://gist.github.com/myk502/41264b91f708d1a95d3007d87c4f82e1

 

一个套接字就是socket模块中socket类的一个实例。它的实例化需要3个参数:

1.第1个参数是地址族,默认是socket.AF_INET(指定使用IPv4协议)

2.第2个参数是流,默认是socket.SOCK_STREAM(指定面向流的TCP协议),或者数据报socket.SOCK_DGRAM套接字。

3.第3个参数是使用的协议,默认是0

下面是绑定和监听两个函数

bind(self, address): 参数address代表包含ip和端口的一个二元组

listen(self, backlog=None): 参数backlog代表最大连接数据,默认为1,看有的说通常设为5

接下来就是用serverSocket.accept()  接收到客户连接请求后,建立新的TCP连接套接字,返回值为包含新的socket对象和客户端ip的二元组

recv(self,buffersize,flags=None) 用于接收数据,要填的参数就是发送的数据的字节数

紧接着就是他自己的框架代码了,大概就是在一个一个字节读入,打开文件,读取,然后关闭

后面就是最重要的东西,将HTTP的首部传给客户端 

header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (len(outputdata))
connectionSocket.send(header.encode())

还有一个大佬的写法

header = 'HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html; charset=utf-8\nContent-Length: %d\n\n' %(len(outputdata))
			connectionSocket.send(header.encode('utf-8'))

 这里特意强调了中文编码的问题,不加utf-8,浏览器不会识别中文。

后面就比较简单了,在没有找到文件时显示 404 Found,即将HTTP首部返回  header = ' HTTP/1.1 404 Found',最后就是关掉客户服务器,再关掉服务器

下面是可选的练习,以后做了再补在后面

 

### 可选练习

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

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

 

 


 

 
 


 

你可能感兴趣的:(计算机网络)