js的快速开发透明代理,js中的网络编程
分类:新闻中心

而是这两天服务器端js的霸气确实因为node.js项目。在velocity china 2010大会Douglas Crockford(Yahoo!)也可能有叁个topic《平复:服务器端JavaScript》提到node.js。关于node.js的详细资料请google.

试验简单介绍

此试验主要教学TCP和UDP的互连网编程,net模块提供了三个异步网络包装器,用于TCP互联网编制程序,它包含了创办服务器和客商端的章程。dgram模块用于UDP网络编制程序。
参谋链接:https://nodejs.org/api/net.html, https://nodejs.org/api/dgram.html

共14+1个小点 最终七个点是socket  很简短

      node.js的比比较大的六特性子就是事件驱动,在开荒服务器端服务的时候显得十一分便于。明儿晚上在新浪的@timYang也提到了node.js,估算搜狐今日头条也留心到了它的帮助和益处。同临时间,Taobao如今也意味着对node.js有一定的野趣。参见:   ,为了体验一把,就用node.js写了一个晶莹剔透的代理服务层,代码如下:

TCP Server

美高梅网址 ,net模块通过net.createServer方法成立TCP服务器,通过net.connect方法创设顾客端去老是服务器。
透过net模块成立二个TCP Server:
<pre>
// server.js
var net = require('net');
// 创建TCP服务器
var server = net.createServer(function(socket) {
console.log('client connected');
// 监听客商端的数额
socket.on('data', function(data) {
console.log('server got data from client: ', data.toString());
});
// 监听顾客端断开连接事件
socket.on('end', function(data) {
console.log('connection closed');
});
// 发送数据给顾客端
socket.write('Hellorn');
});
// 运转服务
server.listen(8080, function() {
console.log('server bound');
});
</pre>
下一场再创设三个顾客端:
<pre>
// client.js
var net = require('net');
// 连接服务器
var client = net.connect({port: 8080}, function() {
console.log('connected to server');
client.write('World!rn');
});
// 接收服务端的数量
client.on('data', function(data) {
console.log('client got data from server: ', data.toString());
// 断开连接
client.end();
});
// 断开连接
client.on('end', function() {
console.log('disconnected from server');
});
</pre>
运作测量试验:

在虚构机中开发五个终端,先运转TCP服务器代码:
<pre>$ node server.js</pre>
接下来在另八个极限运营TCP顾客端代码:
<pre>$ node client.js</pre>
就能够看出八个极点运维结果。

概念:

复制代码 代码如下:

简轻松单聊天室服务端

询问了根基的东西,上面大家来做一个简单的聊天室吧。
第一创制TCP服务器,和前边同样:
<pre>
// chatServer.js
var net = require('net');
// 创建TCP服务器
var server = net.createServer();
// 存款和储蓄全数顾客端socket
var sockets = [];
server.on('connection', function(socket) {
console.log('Got a new connection');
sockets.push(socket);
socket.on('data', function(data) {
console.log('Got data: ', data);
sockets.forEach(function(otherSocket) {
if (otherSoecket !== socket) {
otherSocket.write(data);
}
});
]);
// 新扩充代码
socket.on('close', function() {
console.log('A client connection closed');
var index = sockets.indexOf(socket);
sockets.splice(index, 1);
});
});
server.on('error', function(err) {
console.log('Server error: ', err.message);
});
server.on('close', function() {
console.log('Server closed');
});
server.listen(8080);
</pre>

//并行是指多个可能七个事件在平等时刻发生;而产出是指四个或多少个事件在同时间隔内爆发

var net = require('net');
var proxyhost="127.0.0.1";//被代理的劳动的IP
var proxyport=3306;//被代理的端口
var listenport=8124;//代理端口
net.createServer(function (socket) {
socket.on("connect",function(){
console.log('connected');
try{
var db=net.createConnection(proxyport,proxyhost);
db.on("connect",function(){
console.log("server connected");
socket.on("data", function (data) {
db.write(data);
});
db.on("data",function(data){
console.log(data.toString('utf8',0,data.legnth));
//console.log(data);
socket.write(data);
});
socket.on("close",function(){
console.log("server closed");
db.destroy();
});
});
db.on("error",function(data){
console.log("error:rn"+data);
});
db.on("end",function(){
console.log("server closed");
socket.destroy();
});
}catch(err){
console.log(err);
}
});
}).listen(listenport, "0.0.0.0");
//用于测量检验,生产情况需思念稳定代码管理

大致聊天室客户端

聊天室的服务端成效宗旨就完毕了,下边大家来写多个简练的客商端吧:
<pre>
// chatClient.js
var net = require('net');
process.stdin.resume();
process.stdin.setEncoding('utf8');
var client = net.connect({ port: 8080 }, function() {
console.log('Connected to server');
// 获取输入的字符串
console.log('input: ');
process.stdin.on('data', function(data) {
// 发送输入的字符串到服务器
console.log('input: ');
client.write(data);
// 输入 'close' 字符串时关闭连接
if (data === 'closen') {
client.end();
}
});
});
// 获取服务端发送过来的数额
client.on('data', function(data) {
console.log('Other user's input', data.toString());
});
client.on('end', function() {
console.log('Disconnected from server');
// 退出用户端程序
process.exit();
});
</pre>

客户端中用到了process这个模块,process是一个Node.js的全局模块,可以在任何地方
直接使用而无需通过require方法引入。process模块允许你获得或者修改当前Node.js
进程的设置。process.stdin用于获取来自标准输入的可读流(Readable Stream)。

前日来运作那个聊天室吧:
<pre>$ node chatServer.js</pre>
在开采三个顶峰窗口,运转:
<pre>$ node chatClient.js</pre>
然后在随机运维的客商端输入字符串并按回车键,会在服务端和任何客商端开到那么些顾客端的输入内容。那样就贯彻了三个轻松的聊天室了_

并发的第一是你有管理多少个职责的力量,不自然要同时。

OK,水到渠成,只用了一丢丢的大运,是的,正是这样轻松。大家把proxyhost,proxyport=3306改费用机的三个数目上,运转后,小编用mysql顾客端连8124,就能够连上3306端口的数据库了。

UDP Server

UDP和TCP类似,通过dgram.createSocket创立服务。
UDP服务器:
<pre>
// udpServer.js
var dgram = require("dgram");
var server = dgram.createSocket("udp4");
server.on("error", function(err) {
console.log("server error:n" + err.stack);
server.close();
});
// 接收来自客商端的信息
server.on("message", function(msg, rinfo) {
console.log("server got: " + msg.toString() + " from " + rinfo.address + ":" + rinfo.port);
});
// 监听服务
server.on("listening", function() {
var address = server.address();
console.log("server listening on " + address.address + ":" + address.port);
});
server.bind(41234);
// server listening 0.0.0.0:41234
</pre>
UDP客户端:
<pre>
// udpClient.js
var dgram = require('dgram');
var client = dgram.createSocket('udp4');
var message = new Buffer('hello shiyanlou');
client.send(message, 0, message.length, 41234, 'localhost', function(err, bytes) {
client.close();
});
</pre>
出殡的新闻必得经过Buffer创造。
然后运营服务端:
<pre>$ node server.js</pre>
再运营客商端:
<pre>$ node client.js</pre>
那时,服务端就能够接受来自客商端的新闻。

Node.js基础的互联网编制程序就讲到这里了。

相互之间的主若是你有同期管理多个职责的力量。

不独是数据库,把proxyhost,proxyport指向到memcached,那么就成为memcached代理了。

/** * Created by liugaohui on 2017/5/26. */ 

因此console.log你能够丰富有益的调试公约。也能够用来监视某些不开放的构和。

 //node全部!!!!!!!!!!

运用node.js开垦网络服务应用程序,例如代理层,httpserver管理极其有助于。

//1.node.js创办端口var http = require("http");http.createServer(function(request, response) {    response.writeHead(200, {"Content-Type": "text/plain"});    response.write("Hello World");    response.end();}).listen(8888);

碰巧有意中人提议了多少个 bug ,谢谢那位情侣。

//2.node.js回调//并行是指多少个或然三个事件在同不经常刻发生;而产出是指三个或八个事件在相同的时候间隔内发生var fs = require("fs");fs.readFile('input.txt', function (err, data) {    if (err) return console.error(err);    // console.log(data.toString());});var i = 0var data22 = new Date().getTime()while (i < 10){    i++    fs.readFile('input.txt', function (err, data) {        if (err) return console.error(err);        // console.log(data.toString());        console.log(new Date().getTime()

你恐怕感兴趣的稿子:

  • node.js入门教程Mini书、node.js入门web应用开荒完全示例
  • 跟小编学Nodejs(一)--- Node.js简要介绍及安装开垦情形
  • node.js WEB开拓中图纸验证码的实现格局
  • 使用VS开发 Node.js指南
  • data22)    });}console.log("程序实践停止!");

//3.node.js 事件管理机制//// Node.js 使用事件驱动模型,当web server接收到诉求,就把它停业然后实行拍卖,然后去服务下二个web央求。// 当那几个需要完结,它被放回管理队列,当达到队列开始,这些结果被重回给客户。// 那一个模型特别快捷可扩大性极其强,因为webserver一直接受央求而不等待别的读写操作。(那也被称之为非阻塞式IO可能事件驱动IO)//10尾!!! 一口吃二个 吃完给她扔出来//伊芙ntEmitter 的着力正是事件触发与事件监听器功用的卷入。// 引进 events 模块var events = require('events');// 成立 eventEmitter 对象var eventEmitter = new events.伊夫ntEmitter();// 创立事件处理程序var connectHandler = function connected() {    console.log('连接成功。');    // 触发 data_received 事件    eventEmitter.emit('data_received');}// 绑定 connection 事件管理程序eventEmitter.on('connection', connectHandler);// 使用佚名函数绑定 data_received 事件eventEmitter.on('data_received', function(){    console.log('数据接收成功。');});// 触发 connection 事件eventEmitter.emit('connection');console.log("程序实行达成。");

//4.Buffer 缓冲区// JavaScript 语言本人独有字符串数据类型,未有二进制数据类型。// 但在管理像TCP流或文件流时,必需使用到二进制数据。由此在 Node.js中,定义了贰个 Buffer 类,// 该类用来创立一个特别存放二进制数据的缓存区。// 在 Node.js 中,// Buffer 类是随 Node 内核一齐公布的宗旨库。// Buffer 库为 Node.js 带来了一种存款和储蓄原始数据的格局,// 能够让 Node.js 管理二进制数据,每当须求在 Node.js 中拍卖I/O操作中移动的数量时,// 就有比非常的大希望选取 Buffer 库。原始数据存款和储蓄在 Buffer 类的实例中。多少个 Buffer// 类似于一个卡尺头数组,但它对应于 V8 堆内部存款和储蓄器之外的一块原始内部存款和储蓄器。var buf = new Buffer(10);console.log(buf)var buf1 = new Buffer("www.runoob.com", "utf-8");console.log(buf1)buf = new Buffer(256);len = buf.write("www.runoob.com");console.log("写入字节数 : "+  len);console.log( buf.toString('ascii',0,5));buf.toJSON()//转 json// console.log(buf.toJSON())//缓冲区合併

//5.Node.js Stream(流)// Stream 有四种流类型:// Readable - 可读操作。// Writable - 可写操作。// Duplex - 可读可写操作.// Transform - 操作被写入数据,然后读出结果。var fs = require("fs");var data = '';// 创制可读流var readerStream = fs.createReadStream('input.txt');// 设置编码为 utf8。readerStream.setEncoding('UTF8');// 处理流事件 --> data, end, and errorreaderStream.on('data', function(chunk) {    data += chunk;});readerStream.on('end',function(){    console.log(data);});readerStream.on('error', function(err){    console.log(err.stack);});console.log("程序实行达成");

//6,Node.js模块系统

//7.Node.js 函数function execute(someFunction, value) {    someFunction(value);}execute(function(word){ console.log(word) }, "Hello");

//8.Node.js 路由

//9,Node.js 全局对象// 输出全局变量 __filename 的值console.log( __filename );// process// process 是四个全局变量,即 global 对象的属性。process.on('exit', function(code) {    // 以下代码永世不会进行    setTimeout(function() {        console.log("该代码不会推行");    }, 0);    console.log('退出码为:', code);});console.log(process.platform);

//10.Node.js 常用工具Array.prototype.haha = function () {    console.log("卧槽!!!")}var arr = [];arr.haha()//原形和三番五次的关联var util = require('util');function Base() { this.name = 'base'; this.base = 一九九二; this.sayHello = function() { console.log('Hello ' + this.name); };}Base.prototype.showName = function() { console.log(this.name);};function Sub() { this.name = 'sub';}//base原形和sub承袭的关联util.inherits(Sub, Base);var objBase = new Base();objBase.showName();objBase.sayHello();console.log(objBase);var objSub = new Sub();objSub.showName();// objSub.sayHello();console.log(objSub);//!!!!!!!!!!!!! 注意:Sub 仅仅承继了Base 在原型中定义的函数,// 而构造函数内部创造的 base 属 性和 sayHello 函数都尚未被 Sub 承接。// 同不经常候,在原型中定义的质量不会被console.log 作 为对象的性质输出。// 若是大家去掉 objSub.sayHello(); 那行的笺注,将会看到:报错了!!!! !!!!!!!// util.inspect// util.inspect(object,[showHidden],[depth],[colors])是二个将随便对象转变为字符串的主意,// util.isArray(object)看是或不是数组 重回true false  ...居多

//11. Node.js 文件系统// var fs = require("fs")// fs.stat(path, callback) 获取文件路线fs.stat("/Users/liugaohui/Desktop/Web/2017.2.23/test/input.txt", function (err, stats) {    console.log(stats)    console.log("是不是为文件(isFile) ? " + stats.isFile());    console.log("是还是不是为目录(isDirectory) ? " + stats.isDirectory());})// fs.writeFile 写入文件

//12.Node.js GET/POST央求// 上传文件,而相当的多时候大家兴许并不要求理会央求体的// 内容,恶意的POST诉求会大大消耗服务器的资源,全部node.js 暗中认可是不会解析央浼体的// ,当您必要的时候,须求手动来做

//13.Node.js 工具模块

//14.Node.js Web 模块

//15.websocket 参照/Users/liugaohui/Desktop/Web/2017.2.23/test 下 socket 文件 很简短的

本文由美高梅网址发布于新闻中心,转载请注明出处:js的快速开发透明代理,js中的网络编程

上一篇:parseFloat进行统计以及对NaN的处理,js判断输入是 下一篇:javascript与webservice的通信实现代码
猜你喜欢
热门排行
精彩图文