net.createServer 的 data 事件获取到的数据该怎么处理?
发布于 6 年前 作者 Hasaki1997 2890 次浏览 来自 问答

举例:

var net = require("net");

var server = net.createServer(function(connect) {
    connect.on("data", function(data) {
        console.log(data.toString());
    });
});
s.listen(1209);

然后输出的 data 是乱码,如果不 toString() 输出的就是一个Buffer对象,然后我试了 Buffer 的各种解码方式,然后无论那种方式都不会输出正常的信息,但是如果一直开着,它偶尔会输出一个

GET http://www.gstatic.com/generate_204 HTTP/1.1
Host: www.gstatic.com
Proxy-Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

一个正常的请求头. 我该怎么处理这个data对象呢?我的目的是想获取 每个GET之后的网址

12 回复

补充说明下,我是开着代理的,所有的访问会发送到本地的1209端口,我是在访问www.baidu.com时遇到这种情况的

image.png 乱码是像这样的一坨东西

https://nodejs.org/api/net.html#net_net_createserver_options_connectionlistener net是用来创建TCP或IPC应用的,你捕捉到的是TCP数据包,直接toString肯定乱码。

若你想创建一个HTTP应用,应该require(‘http’),https://nodejs.org/api/http.html#http_http_createserver_options_requestlistener 这货捕捉到的才是解包后的HTTP信息。

这个是官方的做一个HTTP应用的入门教程,英语好可以看一下,不好的话可以百度上搜node的中文文档看(其实也不需要看英文,直接把代码copy下来就差不多了) https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/

如果不懂啥是TCP啥是HTTP,看这个 https://my.oschina.net/yzbty32/blog/549305 如果还是看不懂的话,可能得补一下计算机网络相关课程了。

@libook 我就是想创建一个代理可以把我对一个https的网站的访问 映射到本地的localhost 3000 端口下,如果用http是不可以的,还要创建证书之类的,我之前研究了很久那个证书,最后我创建好了,但还是不行,我就想换个方法,换成从tcp这个层面来解决…看来这条路似乎也走不通,我还是继续看怎么搞那个证书吧

HTTPS的话,证书大体有两种使用方式:

  1. 全程使用目标网站的证书,客户端走透明代理,依然使用目标网站的域名访问,代理服务器不能解析内容(因为HTTPS是点对点加密的),只能转发TCP数据包。
  2. 客户端使用代理服务器的证书,使用代理服务器的域名访问,代理服务器解析HTTPS数据包,然后使用目标网站的证书从新发起HTTPS请求到目标网站。

针对于你的原始问题,不要toString那个data,因为它本身就是二进制的,buffer是可以传递的,新建一个TCP连接到目标服务器,然后直接把buffer灌进去。

@libook 我目前已经陷入迷茫了,在一家公司实习,老大给我的任务是, create-react-app 创建的项目 npm start 之后本来应该是访问localhost:3000来调试代码, 但是现在要求实现一个代理 然后访问https://www.xxx.com(我们的项目线上地址).目的是为了可以使用线上的cookie. 本来之前的做法是访问http://www.xxx.com来直接调试代码,这个直接开个浏览器代理插件简单设置下,或者直接设置系统代理 127.0.0.1 -> 3000然后就可以了,现在换成https之后就不能这样了,访问会提示未连接到互联网 老大说是证书的问题,但是我生成一个https://www.xxx.com的证书 node-http-proxy来搞一个代理,然后访问还是显示未连接到互联网.我刚开始觉得这个事情应该在webpack-dev-server里面做,然后我在那里面看了半天他的源码也没明白该在哪改,就放弃了,想着用node做一个charles之类的东西,但是我还不知道node能不能实现这个,用Charles是可以完成老大的要求的,但是老大让我用node写一个简化版的用. 我目前的唯一的成果就是看了node-http-proxy的源码,这个东西他可以起一个代理服务器,让我访问https://localhost:8000的时候实际上显示的时候跑在3000端口的react的东西,但是我浏览器开个代理(就是之前那种127.0.0.1 -> 8000) 然后我随便访问一个https的网站,还是显示未连接到互联网.

啰嗦的有点多了,大佬能帮忙想想这东西改怎么弄吗,或者给我一个方向,我搞这个也快一个月了,最大的问题是我不知道具体是该往那个方向努力,一会我看node的一对API一会又看webpack-dev-server的代码,然后想不明白又看node-hhp-proxy的源码,而且看完也不知道我这问题怎么解决.问了老大两次他都解释了下,但我还是不明白,他主要给我解释了很多为什么要做这个东西…我其实是不明白该具体怎么去做,毕竟实习以前都是create-react-app xxx 然后开始一把梭的,真正的node编程我是没有经验的,大佬如果有时间的话给讲讲这个东西思路该是什么样的可以吗,困扰了我一个多月,感觉都要磨灭我刚准备出来实习的激情了…

不是很明白你的任务到底是要干什么,能详细说一下嘛? 比如说这个东西做出来之后,期望使用效果是什么样子的。

cookie是绑定域的,如果你想使用域名A的Cookie的话,就必须使用域名A来请求网站,但是希望请求到的网站文件是由域名B的服务器提供的,就需要引入一个代理服务器X;访问的电脑上配置所有网络请求发到X代理服务器,然后浏览器使用域名A来请求网站,请求会被系统发到代理服务器X,代理服务器X转发请求到B域的服务器,带着从浏览器发来的A域的Cookie。

这里有个关键问题就是你在使用域名A来访问网站的时候,浏览器会使用域名A的证书来创建HTTPS请求,最终这个请求到达服务器B的时候,如果服务器B没有配置使用域名A的私钥来解密,就会导致请求无法被服务器B解析。所以你得在服务器B上部署域名A的私钥,用于解析本应该发到服务器A的HTTPS请求。如果域名A是你们所有的话,就很好办,只需要在服务器B上部署和服务器A一样的TLS私钥就可以了,如果A域不是你们自己的话,就得需要自己签名一个A域的证书,安装在发请求的系统里,配置在服务器B上。

webpack的dev server只是个文件服务器,npm start的时候webpack会把你的react代码进行编译,然后启动一个静态文件服务来提供你的编译后的网站页面的访问功能,这个和你做的代理没啥关系。你可以用代理服务器软件来做,比如nginx,或者非要自己拿node写的话,也可以去搜一些TCP转发的代码。

注意看响应头里:

Accept-Encoding: gzip, deflate

这是被压缩过了,先需要解压才可以看到正文。

@libook 期望使用效果就是我在本地调试代码,浏览器地址不是localhost:3000而是https://www.xxx.xxx.com,例如我在调试登录页面:本来浏览器的网址该是localhost:3000/login,但是我现在访问https://www.xxx.xxx.com/login和访问localhost:3000/login得到的内容是一样的

@Hasaki1997 那我提供的思路应该是可以的。

回到顶部