我感觉你空间里这个杀手不太冷百度云了

基于nodejs的HTTP服务器搭建
查看: 20353|
评论: |原作者: html5cn|来自:
摘要: 作者本身也是刚接触nodejs,所以在知识面方面还存在很多漏洞。
nodejs下载地址:http://nodejs.org/
在Window下面安装的(msi文件),就是纯自动的,选择添加到环境变量和安装路径就ok了。可以打开cmd命令台,通过 ...
& && & 作者本身也是刚接触nodejs,所以在知识面方面还存在很多漏洞。
& && &&&nodejs下载地址:
& && & 在Window下面安装的(msi文件),就是纯自动的,选择添加到环境变量和安装路径就ok了。可以打开cmd命令台,通过输入命令 node 进入编译模式,做一些短代码的测试。
& && & 一般情况下作者使用的都是 node file_name的方式来运行代码。
& && & 现在就把搭建http服务器的代码贴上,文件名:httpserver.js(可以不用js为后缀)
// 这是一个简单的Node HTTP服务器,能处理当前目录的文件
// 并能实现两种特殊的URL用于测试
// 用HTTP://localhost:8000或http://127.0.0.1:8000连接这个服务器
// 首先加载所有需要用到的模块
var http = require('http');& && &&&// Http服务器API
var fs = require('fs');& && && && &// 用于处理本地文件
var server = new http.Server();& & // 创建新的HTTP服务器
server.listen(8000);& && && && &// 监听端口8000
// 使用on方法注册时间处理
server.on('request', function(request, response) { // 当有request请求的时候触发处理函数
& & console.log('request');
& & // 解析请求的URL
& & var url = require('url').parse(request.url);
& & // 特殊URL会让服务器在发送响应前先等待
& & switch(url.pathname) {& &
& & case ''||'/' : // 模拟欢迎页,nodejs是高效流处理的方案,也可以通过配置文件来配置
& && &&&fs.readFile('./index.html', function(err, content){
& && && && &if(err) {
& && && && && & response.writeHead(404, { 'Content-Type':'text/ charset="UTF-8"' });
& && && && && & response.write(err.message);
& && && && && & response.end();
& && && && &} else {
& && && && && & response.writeHead(200, { 'Content-Type' : 'text/ charset=UTF-8' });
& && && && && & response.write(content);
& && && && && & response.end();
& && && && &}
& && &&&});
& & case '/test/delay':// 此处用于模拟缓慢的网络连接
& && &&&// 使用查询字符串来获取延迟时长,或者2000毫秒
& && &&&var delay = parseInt(url.query) || 2000;
& && &&&// 设置响应状态和头
& && &&&response.writeHead(200, {'Content-type':'text/ charset=UTF-8'});
& && &&&// 立即开始编写响应主体
& && &&&response.write('Sleeping for' + delay + ' milliseconds...');
& && &&&// 在之后调用的另一个函数中完成响应
& && &&&setTimeout(function(){
& && && && &response.write('done.');
& && && && &response.end();
& && &&&}, delay);
& & case '/test/mirror':// 如果请求是test/mirror,则原文返回它
& && &&&// 响应状态和头
& && &&&response.writeHead(200, {'Content-type':'text/ charset=UTF-8'});
& && &&&// 用请求的内容开始编写响应主体
& && &&&response.write(request.mothod + ' ' + request.url + ' HTTP/' + request.httpVersion + '\r\n');
& && &&&// 所有的请求头
& && &&&for (var h in request.headers) {
& && && && &response.write(h + ':' + request.headers[h] + '\r\n');
& && &&&response.write('\r\n');// 使用额外的空白行来结束头
& && &&&// 在这些事件处理程序函数中完成响应
& && &&&// 当请求主体的数据块完成时,把其写入响应中
& && &&&request.on('data', function(chunk) { response.write(chunk); });
& && &&&// 当请求结束时,响应也完成
& && &&&request.on('end', function(chunk){ response.end(); });
& & case '/json' : // 模拟JSON数据返回
& && &&&// 响应状态和头
& && &&&response.writeHead(200, {'Content-type':'application/ charset=UTF-8'});
& && &&&response.write(JSON.stringify({test:'success'}));
& && &&&response.end();
& & default:// 处理来自本地目录的文件
& && &&&var filename = url.pathname.substring(1);& & // 去掉前导'/'
& && &&&var type = getType(filename.substring(filename.lastIndexOf('.')+1));
& && &&&// 异步读取文件,并将内容作为单独的数据模块传给回调函数
& && &&&// 对于确实很大的文件,使用流API fs.createReadStream()更好
& && &&&fs.readFile(filename, function(err, content){
& && && && &if(err) {
& && && && && & response.writeHead(404, { 'Content-Type':'text/ charset="UTF-8"' });
& && && && && & response.write(err.message);
& && && && && & response.end();
& && && && &} else {
& && && && && & response.writeHead(200, { 'Content-Type' : type });
& && && && && & response.write(content);
& && && && && & response.end();
& && && && &}
& && &&&});
function getType(endTag){
& & var type=
& & switch(endTag){
& & case 'html' :
& & case 'htm' :
& && &&&type = 'text/ charset=UTF-8';
& & case 'js' :
& && &&&type = 'application/ charset="UTF-8"';
& & case 'css' :
& && &&&type = 'text/ charset="UTF-8"';
& & case 'txt' :
& && &&&type = 'text/ charset="UTF-8"';
& & case 'manifest' :
& && &&&type = 'text/cache- charset="UTF-8"';
& & default :
& && &&&type = 'application/octet-stream';
}复制代码按住shift键并右击文件所在目录,在此处打开命令窗口,输入
node httpserver.js复制代码
& && & 即可启动监听。由于单线程的关系,并不会像java一样,在抛出异常后继续运行,需要做多线程处理或者做一个监听线程来重启崩溃的服务器。
测试:& && &&& & & &在文件的同目录下放上一个简单的index.html页面来进行测试,在浏览器上输入:http://localhost:8000,进入index.html页面即成功,其他json自行测试
&!DOCTYPE html&
&meta charset="UTF-8"&
&title&Insert title here&/title&
&/html&复制代码& && & 代码基本参考JavaScript权威指南第12章中的http服务器示例,修改了一些常用web处理。作者本身也是由于公司嵌入式web开发的关系选择nodejs测试作为服务器使用,目前还在测试阶段。
& && & 下面是代码,协议模块就不贴上了,是公司制定的,对于嵌入式基本没什么了解,在用户的机子上使用sdk插件来与监视器交互是目前公司采用的解决方案,这个方式让我蛋疼无语。所以绞尽脑汁各种测试,java服务由于开发移动端的大哥已经封装过了,所以自己测试了基于C++语言的,采不采取这个方案是一回事,这个过程确实学到了些东西。
* @author linjiabin
* 1、作为一个HTTP服务器,让WEB客户端获取数据
* 2、在HTTP服务器上另起一个TCP客户端向嵌入式相机发送协议请求
* 难点:协议的封装
// 首先加载所需要的模块作为全部变量
// HTTP服务端
var http_port = 9090, http = require('http'), server = new http.Server();
server.listen(http_port);
console.log('服务器正在监听端口:'+http_port);
// TCP客户端,
var net = require('net'), client = new net.Socket();
var tcp_port = 6666, tcp_host = '172.16.55.118';
client.connect(tcp_port, tcp_host);
console.log('建立通道:\nhost:'+tcp_host+'\nport:'+tcp_port);
// 文件系统处理
var fs = require('fs');
// 自定义协议模块
var protocol = require('./protocol.js');
// 监听请求
server.on('request', function(request, response) {
& & console.log('正在处理请求:'+request.url);
& & var url = require('url').parse(request.url);
& & client.on('data', function(data){
& && &&&if(data.length === 34)
& && &&&var result = deal(data);
& && &&&console.log('/***********************start***************************/');
& && &&&console.log(result[2].join(' '));
& && &&&console.log('/***********************end&&***************************/');
& && &&&response.writeHead(200, {'Content-type':'text/ charset=UTF-8'});
& && &&&response.write(result[1]);
& && &&&response.end();
& && &&&// client.destroy();
& & client.on('close', function() {
& && &&&console.log('Connection closed');
& & switch(url.pathname) {
& & case ''||'/' :
& && &&&fs.readFile('./index.html', function(err, content){
& && && && &if(err) {
& && && && && & response.writeHead(404, {
& && && && && && &&&'Content-Type':'text/ charset="UTF-8"'
& && && && && & });
& && && && && & response.write(err.message);
& && && && && & response.end();
& && && && &} else {
& && && && && & response.writeHead(200, {
& && && && && && &&&'Content-Type' : 'text/ charset=UTF-8'
& && && && && & });
& && && && && & response.write(content);
& && && && && & response.end();
& && && && &}
& && &&&});
& & case '/test' :
& && &&&var bytes = getABytes();
& && &&&client.write(bytes);
& && &&&default : // 处理来自本地目录的文件
& && &&&var filename = url.pathname.substring(1);& & // 去掉前导'/'
& && &&&var type = getType(filename.substring(filename.lastIndexOf('.')+1));
& && &&&// 异步读取文件,并将内容作为单独的数据模块传给回调函数
& && &&&// 对于确实很大的文件,使用流API fs.createReadStream()更好
& && &&&fs.readFile(filename, function(err, content){
& && && && &if(err) {
& && && && && & response.writeHead(404, {
& && && && && && &&&'Content-Type':'text/ charset="UTF-8"'
& && && && && & });
& && && && && & response.write(err.message);
& && && && && & response.end();
& && && && &} else {
& && && && && & response.writeHead(200, {
& && && && && && &&&'Content-Type' : type
& && && && && & });
& && && && && & response.write(content);
& && && && && & response.end();
& && && && &}
& && &&&});
function deal(data) {
& & if(data.length===34) return ['心跳报文','心跳报文',['心跳报文']];//console.log('心跳报文');
& & var result = '';
& & data = data.slice(34);
& & var HeadTag = data.slice(0,4).toString();
& & var BodyLens = data.slice(4,8);
& & BodyLens = BodyLens[0] + (BodyLens[1]&&8) + (BodyLens[2]&&16) + (BodyLens[3]&&24);
& & var ProtocolVerify = data.slice(8, 10);
& & ProtocolVerify = ProtocolVerify[0] + (ProtocolVerify[1]&&8);
& & var MainCmdId = '0x' + data.slice(10, 11)[0].toString(16);
& & var SubCmdId = '0x' + data.slice(12, 13)[0].toString(16) + data.slice(11, 12)[0].toString(16);
& & var Reserverd = '0x' + data.slice(13, 14)[0].toString(16);
& & var BodyArryNum = data.slice(14, 15)[0];
& & var Body = data.slice(15, 14+BodyLens).toString();
& & var EndTag = '0x' + data.slice(14+BodyLens, 15+BodyLens)[0].toString(16);
& & result += '\n消息头标识:';
& & result += HeadT
& & result += '\n消息体的长度:';
& & result += BodyL
& & result += '\n协议验证码:';
& & result += ProtocolV
& & result += '\n主命令ID:';
& & result += MainCmdId;
& & result += '\n子命令ID:';
& & result += SubCmdId;
& & result += '\n预留位:';
& & result += R
& & result += '\n消息体参数个数:';
& & result += BodyArryN
& & result += '\n消息体:';
& & result += B
& & result += '\n结束标志:';
& & result += EndT
& & //console.log([HeadTag, BodyLens, ProtocolVerify, MainCmdId, SubCmdId, Reserverd, BodyArryNum, Body, EndTag].join(' '));
& & return [result, Body, [HeadTag, BodyLens, ProtocolVerify, MainCmdId, SubCmdId, Reserverd, BodyArryNum, Body, EndTag]];
function getABytes() {
& & var t = new protocol.BaseProtocol();
& & t.MainCmdId=0x12;
& & t.BodyLens=13;
& & t.SubComId=(function(){
& && &&&var bytes = new Buffer(2);
& && &&&bytes[0]=0x00;
& && &&&bytes[1]=0x01;
& & t.Body='Admin|Admin|';
& & t.BodyArryNum=0x02;
& & var bytes = t.getBytes();
function getType(endTag) {
& & switch(endTag){
& & case 'html' :
& & case 'htm' :
& && &&&type = 'text/ charset=UTF-8';
& & case 'js' :
& && &&&type = 'application/ charset="UTF-8"';
& & case 'css' :
& && &&&type = 'text/ charset="UTF-8"';
& & case 'txt' :
& && &&&type = 'text/ charset="UTF-8"';
& & case 'manifest' :
& && &&&type = 'text/cache- charset="UTF-8"';
& & default :
& && &&&type = 'application/octet-stream';
刚表态过的朋友 ()
Powered by用nodejs的实现原理和搭建服务器(动态)
投稿:jingxian
字体:[ ] 类型:转载 时间:
下面小编就为大家带来一篇用nodejs的实现原理和搭建服务器(动态)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
今天是我学习的Node.js的第二天,所谓的node.js其实它是javascript编写的服务器的语言,同时它又是属于后台的框架,是一个开放性的平台。
一、相关理论知识:
我们可以用requre来引入模块、用module.exprorts来导出模块。
安装nodejs和配置npm
1.安装nodejs,安装完后在cmd命令行中敲入node -v,查看版本。
2.在cmd中敲入npm config list查看是否安装npm。
3.设置镜像地址。
淘宝镜像:在命令行中敲入npm config set registry=https://registry.npm.taobao.org
朗沃服务器镜像:在命令行中敲入npm config set registry=http://192.168.8.10:7001
安装express
1.初始化项目。命令:npm init
2.安装全局的express生成工具。命令:npm install express-generator -g
3.执行express命令生成项目的骨架。
4.在命令中输入npm install下载express依赖的所有插件。
5.使用npm start启动服务器。或者node app。
在输入上面的命令时,一定要仔细一点,不然容易敲错,同时在生成express时我们一定要先进入到某个具体的文件夹,再进行相应的操作。
下面是一些模块方法:
3、http.createServer是用来创建服务器
4、listen(填入一个应用程序的端口号)
5、res.end()& 这是我们在写node.js时必须加的一个结束方法
而它可发送一个字符串等任何数据,数组除外。
二、 node.js的相关操作
1、 node.js的实现原理:
简单的来说:node.js是当用户量很大的时候,服务端会把收到的用户信息放在事件队列中,再由事件队列机制对每一天用户请求进行处理,例如,利用回调函数,找到一个又一个想对应的方法就执行。然后处理完后就响应到浏览器上面。
2、 node.js的获取网页中的数据
1&get方法:
router.get('/login',function(req,res){
var username=req.query.
var pwd=req.query.
console.log(username,pwd);
res.send('登录成功');
2& post方法:
router.get('/login',function(req,res){
var username=req.body.
var pwd=req.body.
console.log(username,pwd);
res.send('登录成功');
在上面变量pwd=req.body.pwd,这里的pwd指的是form表单中name属性的值。
以上这篇用nodejs的实现原理和搭建服务器(动态)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具利用Node.js简单搭建web服务器_nodejs吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:9,264贴子:
利用Node.js简单搭建web服务器收藏
来自官方的一个简单示例: var http = require('http');http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');}).listen(1337, "127.0.0.1");console.log('Server running at );保存为example.js 然后 cmd 下 &node example.js
在浏览器中,输入
即可看到效果哦!
没有练习场地?来上延啊!
Hello World服务器,不管谁来,都hello,world、、
不知道用,提示什么node不是内部或外部命令。。。
那应该是安装有问题吧,
node.js 学习站点
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 这个杀手不太冷女主角 的文章

 

随机推荐