这是自顶向下中套接字的作业一,最近才看完谢希仁的计网,来做做自顶向下的实验。
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传输给其他主机
这是整个传输的过程图
首先得去看一下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