计算机网络自顶向下webserver
2017-06-28 09:20
99 查看
网络编程一项基本功是socket编程,包括TCP socket,UDP socket的客户端、服务器端编程。
应用层的各路协议如http,smtp,telnet,ftp等都依赖于传输层的TCP或者UDP,具体讲就是这两种socket为应用层提供传输功能。
利用tcp socket能编写web server,它处理client端发起的http请求,然后发送响应。
TCP是面向连接的协议,也就是发送数据前需要双方发送控制字来建立连接(俗称三次握手),是client和server上的一个「欢迎套接字」进行通信,当成功连接上后,server端生成一个「连接套接字」,专门用于和这个客户互相发送数据。连接套接字和欢迎套接字是同一进程中不同线程,这样一来只有一个进程因此端口需要做出改变。高性能的web server一般都是这么搞的。
接下来我们动手写个web server
比如《计算机网络——自顶向下方法》第二章的一个题目:
用python开发一个简单web server,它仅能处理一个请求:当用户连接时创建套接字;从这个连接接受HTTP请求;解释该请求以确定所请求的文件;从服务器文件系统中获得请求的文件;创建一个由请求的文件组成的HTTP响应报文;经TCP连接想请求的浏览器发送响应。若请求的文件不存在则返回“404 not found”
不难写出答案:
应用层的各路协议如http,smtp,telnet,ftp等都依赖于传输层的TCP或者UDP,具体讲就是这两种socket为应用层提供传输功能。
利用tcp socket能编写web server,它处理client端发起的http请求,然后发送响应。
TCP是面向连接的协议,也就是发送数据前需要双方发送控制字来建立连接(俗称三次握手),是client和server上的一个「欢迎套接字」进行通信,当成功连接上后,server端生成一个「连接套接字」,专门用于和这个客户互相发送数据。连接套接字和欢迎套接字是同一进程中不同线程,这样一来只有一个进程因此端口需要做出改变。高性能的web server一般都是这么搞的。
接下来我们动手写个web server
比如《计算机网络——自顶向下方法》第二章的一个题目:
用python开发一个简单web server,它仅能处理一个请求:当用户连接时创建套接字;从这个连接接受HTTP请求;解释该请求以确定所请求的文件;从服务器文件系统中获得请求的文件;创建一个由请求的文件组成的HTTP响应报文;经TCP连接想请求的浏览器发送响应。若请求的文件不存在则返回“404 not found”
不难写出答案:
#coding:utf-8 from socket import * host = '' #对应本机所有ip地址 port = 8899 #TCP socket端口 address = (host, port) serverSocket = socket(AF_INET, SOCK_STREAM) #创建TCP socket serverSocket.bind(address) #绑定地址 serverSocket.listen(1) #开始监听 while True: try: connectionSocket, clientAddr = serverSocket.accept() #获取「连接套接字」 message = connectionSocket.recv(1024) #获得http报文 filename = message.split()[1] #获得URI,去掉首部'/'就是文件名 f = open(filename[1:]) outputdata = f.readlines() #逐行读出文件内容并存到list中 connectionSocket.send('HTTP/1.1 200 OK\r\n\r\n') #发response行 for i in range(0, len(outputdata)): connectionSocket.send(outputdata[i]) #把文件各行数据塞到response中 send只能是string类型 connectionSocket.close() #关闭数据连接 except IOError: connectionSocket.send("404 not found") #文件不存在时异常处理 connectionSocket.close() serverSocket.close() ****************************************************************************8 ############################################################################# hello.html 和webserver位于同一根目录下 message= GET /hello.html HTTP/1.1 Host: 123.207.178.224 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: wp-settings-time-1=1495099509; wp-settings-1=editor%3Dtinymce Connection: keep-alive Upgrade-Insecure-Requests: 1 message.split()=['GET', '/hello.html', 'HTTP/1.1', 'Host:', '123.207.178.224', 'User-Agent:', 'Mozilla/5.0', '(Windows', 'NT', '10.0;', 'WOW64;', 'rv:54.0)', 'Gecko/20100101', 'Firefox/54.0', 'Accept:', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language:', 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding:', 'gzip,', 'deflate', 'Cookie:', 'wp-settings-time-1=1495099509;', 'wp-settings-1=editor%3Dtinymce', 'Connection:', 'keep-alive', 'Upgrade-Insecure-Requests:', '1'] ####message.split() 默认以空格为分隔符,吧str型message变为列表 filename = message.split()[1] #filename = '/hello.html' 取出列表中第二个字符串 f= filename[1:] #f = 'hello.html' 去掉/
相关文章推荐
- 网络简介--计算机网络自顶向下笔记(一)
- 计算机网络自顶向下方法之一一一第二章之一
- 自顶向下(一)——计算机网络与英特网
- 计算机网络(自顶向下方法)学习笔记 1.8 小结
- [笔记] [计算机网络 · 自顶向下方法] [5.4 交换局域网]
- 《计算机网络 自顶向下方法》 - 学习笔记 - 第二章
- 计算机网络(自顶向下方法)(原书第4版)课后复习题解答(第四章)
- 计算机网络-自顶向下方法与Internet特色笔记之二
- 计算机网络自顶向下 :应用层(FTP、SMTP、POP3、IMAP)
- TCP讲解(2)--------摘自《计算机网络-自顶向下方法》
- 计算机网络 自顶向下方法 第五章 链路层
- 计算机网络 自顶向下方法 第一章
- 计算机网络自顶向下第四章网络层
- 计算机网络自顶向下 :因特网的组成
- <计算机网络-自顶向下方法> TCP连接
- 计算机网络自顶向下方法学习笔记
- 计算机网络(自顶向下的方法)学习笔记 1.2 网络边缘
- 跪求《计算机网络 自顶向下方法与Internet特色》答案