python中9步教会你socket连接web之终极版

python中9步教会你socket连接web之终极版

导入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()

你可能感兴趣的:(socket)