导入socket 和 os 模块自不必说
import socket
import os
1.socket连接
server_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)`
参数为socket.AF_INET 是基于网络的,sock.SOCK_STREAM基于TCP协议
2.socket监听
server_sk.bind(("127.0.0.1",8888))
(127.0.0.1是本地ip地址)
参数为(地址,端口号)
3.socket的最大并发数量
server_sk.listen(128)
也就是最多能有同时几个访问
应该吧 嘻嘻嘻
定义了三个函数
这里我定义了三个,当然可以定义多个函数。看你需要几个子页面
def index(url):
with open('index.html','r',encoding='utf-8')as f:
data=f.read().replace('xxx',url).encode()
return data
def hero(url):
with open('hero.html','rb')as f:
data=f.read()
return data
def error(url):
with open('error.html','rb')as f:
data=f.read()
return data
只要调用了函数,在web端就能显示对应的网页内容啦
with open打开(XXX文件,XXX方式,encoding=‘XXX编码方式’)
f.read() 获取此文件内的所有内容(包括换号符号)
定义了一个保存元组的数组
元组内容=(网页的子页面,对应的函数)
func_list=[
('/index',index),
('/hero', hero),
]
对已写好的网页,将网页名放进数组只需一个循环即可遍历完成匹配,无需很多个if
4.服务端接收,并获取与之的连接通道
new_sk,addr=server_sk.accept()
new_sk=server_sk.accept()[0]
两种方式都可以,只需要获取new_sk即我们与网页连接,算是通道一般
5.解码数据流
content=new_sk.recv(1024).decode()
将获取的数据流进行解码,变成我们所能识别的语言
6.获取子网页的路径
content=content.split('\r\n')[0]
将已经解码的字符串进行切割,遇到‘\r\n’即分割
url=content.split()[1]
因为我们只需要网页访问我们哪个子网页,所以要获取它的路径。即以空格切割并获取第二个元素
7.将获取的路径与数组进行匹配
f=None
for func in func_list:
if func[0]==url:
f=func[1]
if f:
response=f(url)
else:
response=error(url)
有则返回与之对应的网页内容
无则返回error页面内容
8.发出Response Headers的报文首行和报文头部(重中之重–标准格式)
规则所定,就只能这样写咯
new_sk.send('Http/1.1 200 OK\r\n'.encode())
new_sk.send('Content-Type:text/html;charset=utf-8\r\n'.encode())
new_sk.send('\r\n'.encode())
9.在网页上呈现内容
将刚才所获取的子页面内容发送至网页端
并且一定要关闭,不然网页会一直转圈圈
new_sk.send(response)
new_sk.close()
最后关闭即可
不写也不碍事
server_sk.close()
完整的代码如下:
import socket
import os
import time
server_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_sk.bind(("127.0.0.1",8888)
server_sk.listen(128)
def index(url):
with open('index.html','r',encoding='utf-8')as f:
data=f.read().replace('xxx',url).encode()
return data
def hero(url):
with open('hero.html','rb')as f:
data=f.read()
return data
def error(url):
with open('error.html','rb')as f:
data=f.read()
return data
func_list=[
('/index',index),
('/hero', hero),
]
while True:
new_sk,addr=server_sk.accept()
content=new_sk.recv(1024).decode()
content=content.split('\r\n')[0]
url=content.split()[1]
f=None
for func in func_list:
if func[0]==url:
f=func[1]
if f:
response=f(url)
else:
response=error(url)
new_sk.send('Http/1.1 200 OK\r\n'.encode())
new_sk.send('Content-Type:text/html;charset=utf-8\r\n'.encode())
new_sk.send('\r\n'.encode())
new_sk.send(response)
new_sk.close()
server_sk.close()