一个困扰我十几天的问题的解决,以及实现内网穿透

今天上午解决了我持续10多天的问题!!!这感觉特别的痛快啊!!!终于把这件事放下了!!!

so,写篇博客记录一下问题怎么解决的。

首先呢,先说一下我的问题:

这个问题呢,对于一个刚上手Python的初学者来说,确实很头疼,也怪我见识短了:
这个问题呢,要从我 十几天之前学习 Http 服务器开始,那天学完了Http服务器,打算自己动手写一个多进程的Http服务器,于是就摆开架势,拿了杯水,坐在电脑面前鼓捣起来。
下面说重点:
当我写完这个多进行的Http服务器,给我i牛X的,我擦,学Python快一个月了,终于写出个像样的东西来了,可给我牛X坏了。当我兴致勃勃,打算在本机访问的时候,“砰砰嘭嘭~~~~”,沃日!!!沃日沃日沃日!
什么情况,网页上一堆源码。。。。。。W哈特?这是为什么呢,一堆 Html 标签套起来的源码!!!这个时候我开始慌惹。。。。。。开始从本地测试,本地打开网页源码,没问题,还是那个帅气的 网页,CSS JS HTML 都有。我当时也不知道怎么想的,去百度搜,去知乎,包括自己抓包 一切的排查错误,最后 很自信地对自己说,你写的服务器没问题,这是网页的事!!!一棒子打死,把问题归结在 我的网页有问题上!!!于是当时,也就没考虑,直接进行下一阶段的学习了。
一直到现在,当我学到 mimi_web_frame 的时候,看到一个东西,才恍然大悟!!!

戏剧性——问题的解决过程:

时间就这么过去了十几天,今天上午学完了一部分 mini_web框架,想着进行动手实践,正当我不打算接着往下看,正准备去打开电脑的时候,偶然间 发现这样一个标题,资源解释为样式表,但转换为MIME类型text / html(似乎与web服务器无关)(Resource interpreted as stylesheet but transferred with MIME type text/html (seems not related with web server)),当时很感兴趣,于是就点了进去——丑陋的页面,往下翻动了几下,突然一句话让我 精神大振:当您要求您的样式表时,您的服务器告诉浏览器它是一个HTML文档( Content-Type:text / css ),而不是样式表( Content-Type:text / html / p>,这是什魔?沃日沃日沃日!!!恍然大悟。

问题的发现:

这里呢,说一下我为什么恍然大悟!!!
我恍然大悟是因为,注意到了这句话里面 一个关键的部分:当您要求您的样式表时,您的服务器告诉浏览器它是一个HTML文档( Content-Type:text / css ),而不是样式表,回想十几天之前,我遇到的那个问题,其中肯定有什么联系,于是心里面就 一下子蹦出一个想法:是不是因为,我没有告诉浏览器,这个文件是一个 Html文档,浏览器才不把它当成网页,而当成了普通的文本文档翻译,导致我看到的不是网页,而是源码的呢?

问题的解决:

分析出来这样一个推测,接下来,就是去实践,查资料。去搜索 服务器给浏览器回复的 Content-Type:text / htmlContent-Type:text / css到底是什么意思!!!
带着一个 小白的好奇心,打开网页,去搜索这两个内容,这一搜,彻底解决了我的疑惑!!!
当服务器去给浏览器回复信息的是时候,回复的请求头部不仅有 200 ok,还有一个重要的参数:Content-Type:text / html,这个表示 让浏览器把返回的 body 当作HTML来解析。
于是,打开我的 Sblime ,找到很久之前写的那个 Http服务器,在返回的 header 里面,加了一行Content-Type:text / html。这下好了,果然,看到的页面不是源码了。
可是。。。。下一个问题来了,那。。为什么页面显示不正常呢?
开始的时候,我抓包看了看,服务器返回了html页面,css样式以及js,没什么问题啊,但是为什么网页显示的这么难看呢?一堆图片堆在那里,字体也不好看——于是,我又去百度上搜,我怀疑是自己浏览器不兼容的问题——然鹅,找了半天也没找到解决办法。当自己心灰意冷准备放弃的时候忽然想起了那句话当您要求您的样式表时,您的服务器告诉浏览器它是一个HTML文档( Content-Type:text / css ),沃日沃日沃日,对啊,Content-Type:text / css这是什么意思呢?
于是,带着一个 小白的好奇心又开始上百度寻找答案!!!这一下,明白了,原来,我的Http服务器,给浏览器说的,是吧所有的 Body 信息都转化为html解读,so,我的.css样式表文件,也特么被当成了.HTML解读,怪不得页面显示这么难看呢,原来不是兼容的问题,是没有css样式啊。恍然大悟以后,给服务器加上了两条判断:if filename.endswith(".css"): ..........else:.......
这下,问题解决了。页面也可以正常访问了,灰常的开森啊。。。。。。。

但是,我不是这么甘心的人

既然服务器写好了,网站挂上去也没有什么问题了,访问也OK了,那么,我想要在别的电脑上访问我自己的网站,我该怎么做呢?
我是有点网络基础的,怎么能不知道,我在的是内网,外网是不能直接访问到内网IP的。
于是,又踏上了 百度 寻求答案的道路——找了很多方法,又是什么在路由器上做端口映射,又是搭建VPN出去的,很多方法,我都实验了一遍。。。。。。都可行,但是,域名的问题怎么解决?我又没有钱去买域名,只能用 IP地址访问吗?
然鹅,我不是一个就这么甘心的人

这里提供一个不错的软件,可以内网穿透,可以免费自定义域名

这里,大佬请掠过,我知道可能很多人很早就知道了。但是对于我这样的人来说第一次看到,很好奇,请容许我吹一吹牛X

nat123
点击链接去官网下载:

为什么推荐这款软件呢,首先,他解决了外网不能访问内网主机的问题,其次,它可以让你免费自定义域名。并且这个平台,虽然说你保存设置的时候需要一两个这个币那个币的,但是你可以想尽一切办法,通过在官方社区里参与评论拿到这些币,这一点看来,还是挺人性化的。

也就说这么多,下面呢,奉上服务器修改之后的源码:
在这里插入图片描述

为了方便复制呢,我把源码放到下面:

import socket
import re
import multiprocessing
import time

class WSGIServer:

	def __init__(self):
		# 创建一个套接字
		self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		# 保证服务器挂掉的时候不会发生资源占用的问题
		self.tcp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
		# 绑定ip 和port
		self.tcp_socket.bind(("", 7890))
		# 设置侦听套接字
		self.tcp_socket.listen(128)

	def server_c(self,new_socket):
		# 接受客户端发来的消息
		request = new_socket.recv(1024).decode("utf-8")
		if request:
			# 把客户端请求的信息 提取出有用的请求页面信息
			line = request.splitlines()
			result = re.match(r"[^/]+(/[^ ]*)", line[0])
			# 提取需要的页面信息
			try:
				html_msg = result.group(1)

				if html_msg.endswith(".py"):
					content = ("现在时间为:{}".format(time.ctime())).encode("utf-8")
					
				else:
					if html_msg == '/':
						f = open(".." + "/index.html", "rb")
						content = f.read()
					else:
						# 打开请求的页面,读取网页源码,发送给浏览器
						f = open(".." + html_msg, "rb")
						content = f.read()
				# 发送回应的头部信息
				response = "HTTP/1.1 200 OK\r\n"
				if html_msg.endswith(".css"):
					response += "Content-Type: text/css\r\n"
				else:
					response += "Content-Type: text/html\r\n"
				response += "\r\n"
				new_socket.send(response.encode("utf-8"))
				# 发送请求的页面主体信息
				new_socket.send(content)
				print("-------为客户端服务完成-----------")
				new_socket.close()

			except Exception as aa:
				response = "HTTP/1.1 404 Error\r\n"
				response += "Content-Type: text/html\r\n"
				response += "\r\n"
				response += "---------------Error----------404---------老王的服务器挂了---------!!!"
				new_socket.send(response.encode("utf-8"))
				new_socket.close()
				print(aa)
		else:
			print("-----------客户端已关闭---------")
			new_socket.close()


	def run_forever(self):
		while True:
			# 等待客户端的连接
			new_socket, user_addr = self.tcp_socket.accept()
			# 连接客户端,为客户端服务s
			p = multiprocessing.Process(target=self.server_c, args=(new_socket,))
			p.start()
			new_socket.close()
			# server_c(new_socket)

		self.tcp_socket.close()

def main():
	# 创建实例
	wsgi_server = WSGIServer()
	# 调用 run_forever方法
	wsgi_server.run_forever()

if __name__ == '__main__':
	main()

就说这么多了,通过这个事呢,我也明白了一个道理:遇到问题了呢,要考虑周全,不要想着去问别人,自己先尝试解决,你的问题留下了,时时刻刻想着它,总有那么一刹那,上帝给了你提示,就解决了。要乐观,无论什么事,都要选择进步,改变了就是进步。

发布了36 篇原创文章 · 获赞 75 · 访问量 5455

猜你喜欢

转载自blog.csdn.net/weixin_44449518/article/details/98739210