socket

#web框架的本质
import socket #首先需要导入socket包

server_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#socket.AF_INET : 基于网络
#socket.SOCK_STREAM : 基于 TCP 协议
server_sk.bind((‘127.0.0.1’, 9999))#绑定地址和端口号
server_sk.listen(128)#设置最大并发数为128

while True:

	new_sk, addr = server_sk.accept() #等待客户端的链接
	第一个参数 new_sk,表示一个新的socket对象,第二个参数时客户端的地址
	content = new_sk.recv(1024).decode() #接受客户端的内容
	print(content) #封装了一些请求头的内容

	#给浏览器返回内容
	#先发送响应头
	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('你好博客'.encode())

	new_sk.close() #关闭new_sk

server_sk.close()

看完web框架的本质,我们紧接着进行小小的扩展

如何让我们的Web服务根据用户请求的URL不同而返回不同的内容呢?
小事一桩,我们可以从请求相关数据里面拿到请求URL的路径,然后拿路径做一个判断…
一看就会之socket的示例与讲解
con = content.split(’\r\n’)[0]
url = con.split(’ ')[1]
#运用字符串的切割功能来取出/index
if url == ‘/index’:
response = ‘这是首页’
elif url == ‘/hero_list’:
response = ‘这是英雄页’
else:
response = ‘这是错误页面,404’
#运用if-elif-else语句来进行判断
一看就会之socket的示例与讲解
最后new_sk.send(response.encode())进行输出
记得close关闭new_sk哟

巧妙的使用函数

问题:如果有很多很多路径要判断怎么办?难道要挨个写if判断? 当然不用,我们有更聪明的办法。
import socket

sever_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sever_sk.bind((‘127.0.0.1’, 9999))
sever_sk.listen(128)

def index(url):
s = ‘这是{}页面’.format(url).encode()
return s
def hero_list(url):
s = ‘这是{}页面’.format(url).encode()
return s
def error(url):
s = ‘404页面’.encode()
return s

while True:
new_sk, addr = server_sk.accept()
content = new_sk.recv(1024).decode()
con = content.split(’\r\n’)[0]
url = con.split(’ ')[1]
if url == ‘/index’:
response = index(url)
elif url == ‘/hero_list’:
response = hero_list(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()

函数的进阶版

import socket

server_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sk.bind((‘127.0.0.1’, 9999))
server_sk.listen(128)

def index(url):
s = ‘这是{}页面’.format(url).encode()
return s
def hero_list(url):
s = ‘这是{}页面’.format(url).encode()
return s
def error(url):
s = ‘404页面111’.encode()
return s

#定义一个url 和 执行函数的列表
func_list = [
(’/index’,index),
(’/hero_list’,hero_list)
]

while True:
new_sk, addr = server_sk.accept()
content = new_sk.recv(1024).decode()
con = content.split(’\r\n’)[0]
url = con.split(’ ')[1]

f = None
for func in func_list:
if func[0] == url:
f = func[1] #将元祖第二个元素(函数名)的地址赋值给 f 变量
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()

返回具体的html文件

完美解决了不同URL返回不同内容的问题。 但是我不想仅仅返回几个字符串,我想给浏览器返回完整的HTML内容,这又该怎么办呢?
没问题,不管是什么内容,最后都是转换成字节数据发送出去的。 我们可以打开HTML文件,读取出它内部的二进制数据,然后再发送给浏览器。
import socket

server_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sk.bind((‘127.0.0.1’, 9999))
server_sk.listen(128)

def index(url):
with open(‘index.html’, ‘rb’, ) as f:
data = f.read()
return data
def hero_list(url):
with open(‘hero_list.html’, ‘r’, encoding=‘utf-8’) as f:
data = f.read().encode()
return data
def error(url):
s = ‘404页面’.encode()
return s

func_list = [
(’/index’,index),
(’/hero_list’,hero_list)
]

while True:
new_sk, addr = server_sk.accept()
content = new_sk.recv(1024).decode()
con = content.split(’\r\n’)[0]
url = con.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()

如何让网页动起来

这网页能够显示出来了,但是都是静态的啊。页面的内容都不会变化的,我想要的是动态网站。
没问题,我也有办法解决。我选择使用字符串替换来实现这个需求。(这里使用时间戳来模拟动态的数据)
import socket
import time

server_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sk.bind((‘127.0.0.1’, 9999))
server_sk.listen(128)

def index2(url):
with open(‘index2.html’, ‘rb’, ) as f:
data = f.read()
data.replace(‘xxxx’,str(time.time()))
return data
def error(url):
s = ‘404页面’.encode()
return s

func_list = [
(’/index2’,index2)
]

while True:
new_sk, addr = server_sk.accept()
content = new_sk.recv(1024).decode()
con = content.split(’\r\n’)[0]
url = con.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的学习内容就到此结束了

相关文章:

猜你喜欢
相关资源
相似解决方案