Category: 未分类

五月 18th, 2017 by lanxinxichen@126.com

最近很少写博客了,一方面单纯是因为忙,太多事情要做,另一方面也是没有好好梳理和准备要写的内容.

这篇博客也先水一下,列出来准备要写的文章和大纲吧.

1.关于常规代码帮我们做了那些http封装

准备使用不同的语言写一些简单的http请求,然后对照socket通信信息,拆解自动封装的请求信息.

2.ssh登陆与https安全

讲述一下ssh和https的原理,同时增加一些关于服务器上ssh扩展内容的介绍.

3.使用守护进程热更新web service

调研一下常规的热启动的方式,然后自己实现一个平滑升级的功能

4.树莓派当远程服务器的可行性

会涉及到树莓派无线设置,内网穿透思路以及搭建一个远程可用的应用服务(具体的看到时候想做什么内容).

 

先写这么多,以后有补充再填写进来,完成后带上链接,并标记已完成.

Posted in 未分类

三月 28th, 2017 by lanxinxichen@126.com

由于公司需要,尝试使用Node进行开发接口服务.但是在调试的过程中发现很多一些问题,在这里简单整理了一下形成文章.

文章主要涉及两方面的内容:

  1. body-parser与Content-Type
  2. socket通信调试

Body-parser的简单分析

express采用的body-parser中间件进行body解析的,如果不使用中间件的话,那么收到的body是一个stream对象,这个stream对象可以进行stream支持的一些操作,比如pipe,所以可以使用 request的stream通过pipe到一个writeStream保存到一个图片文件中.

Body-paser有四种接口形式:

  1. Json解析的json字符串并返回一个object对象
  2. Raw 强制解析成buffer对象
  3. Text 强制解析成string对象
  4. Urlencoded 解析urlencoded解析后的object对象

不同的接口形式可以进行不同的选择,比如如果入参为json字符串的话,就可以使用json接口,这样就可以通过req.body拿到解析后的object对象,使用起来非常方便.

不同的传参方式也就以为着不同的传输格式.如果使用不正确的解析方式,解析结果也会大不相同,比如我在使用urlencoded处理传输进去的字符串的时候,如果不指定Content-Type为application/x-www-form-urlencoded的话,可能默认采用的json格式去解析的,也就会造成我拿到的req.body是一个空对象,即{}.

Socket事件监听与通信调试

项目已经代码在: https://github.com/fengxiaochuang/socketDebug

其实一个市场项目推进我去了解并且尝试调试nodejs的socket调试,因为我们在尝试使用telnet去测试socket的时候,发现只要乱输入的话,telnet就会直接断开,并且返回一个Connection refuse(仅Linux上出现,Windows无返回错误直接关闭并退出).

事实上,通过Node http.createServer 创建的一个web服务,是只接受标准的HTTP协议输入的.如果输入的是其他不标准的字符,就会通过socket抛出一个Parse Error异常,如” HPE_INVALID_METHOD”, ‘HPE_INVALID_CONSTANT’.

通过监听Socket的几个事件,就可以轻松的捕获到异常和输入的通信信息.

Connetion事件:

Emitted when a new connection is made. socket is an instance of net.Socket.

新建连接时发出。 socket是net.Socket的一个实例。

server.on("connection", function (socket) {         // TODO: do some thing})

由于创建连接后,会产生一个socket,所以就可以使用socket的各种方法和属性,比如:

// 请求地址对象信息
console.log(socket.address());
// 远程访问的ip地址
console.log(socket.remoteAddress);
// ipv4 or ipv6
console.log(socket.remoteFamily);
// 远端请求端口
console.log(socket.remotePort);

因为是socket,所以我也可以通过监听socket来达到捕获具体的信息通道.

捕获传输数据的事件并打印

socket.on('data', function (res) {
console.log("接受到的数据:" + res.length);
console.log(res.toString("utf8"));
request += res.toString();
});

捕获socket异常

socket.on('error', function (err) {
RequestInfo.write(request); // 封装了一个保存报文信息的文件
console.log(err);
});

同样,也可以捕获end, close, finish事件,然后获取相关信息.

socket.on('end', function () {
console.log('connection is end');
});
socket.on('close', function () {
console.log('connection is close');
});
socket.on('finish', function () {
console.log('connection is finish');
});

除此之外,http请求触发事件,当一个标准的http协议请求来的时候就能够触发.

// 只要有标准HTTP协议请求就触发
server.on("request", function (req) {
// http.IncomingMessage
// header信息
console.log(req.headers);
// 请求方法
console.log(req.method);
// console.log(req.rawHeaders);
// console.log(req.rawTrailers);
// 请求码
console.log(req.statusCode);
// 状态信息
console.log(req.statusMessage);
// socket对象
console.log(req.socket);
// 请求地址
console.log(req.url);
});

参考链接:

https://nodejs.org/api/http.html

https://nodejs.org/api/net.html#net_class_net_socket

https://nodejs.org/api/stream.html

 

Posted in 未分类

四月 28th, 2015 by lanxinxichen@126.com

五月三号,郑州求约

只有半天时间,晚上还得赶火车.

Posted in 未分类

二月 28th, 2015 by lanxinxichen@126.com

欢迎使用WordPress。这是系统自动生成的演示文章。编辑或者删除它,然后开始您的博客!

Posted in 未分类