1. 程式人生 > >node.js-連線

node.js-連線

http

var http = require('http');
var requestHandler = function(request, response){
    response.end('response is over');
};
var serverPort = 8888;
var web = http.createServer(requestHandler);
web.listen(serverPort);
console.log('webServer running on http://localhost:8888');

require('http'):匯入http模組

requestHandler

:處理方法

response.end:處理結束標記,返回響應

createServer:建立伺服器並指定處理方法

listen:指示監聽埠

http是基本模組,express針對http進行了封裝

更多開發採用express

express

安裝

express是第三方模組,不屬於node的基本模組,需要額外安裝。

MaxOSLinux安裝node不一定自帶npm

有可能需要自己手動安裝和配置環境變數。

npm install -g express

npm源不太好用,可以使用cnpm

npm install cnpm -g --registry=https://registry.npm.taobao.org

安裝時用cnpm,除此之外和npm用法一致

cnpm install -g express

安裝好以後注意環境變數配置。

沒有配置環境變數不影響基本模組使用,但是新模組存在下載完成匯入失敗的可能。

NODE_PATH = D:\software\nodejs\node_modules
PATH = PATH;%NODE_PATH%

基本使用

var express = require('express');
var app = express();
app.get('/hello', function(request, response){
    response.end('hello world!'
); }); var serverPort = 8888; app.listen(serverPort, function(){ console.log('server running on http://localhost:8888'); });

require('express'):模組匯入

express():建立應用

get:呼叫方式,指定訪問路由,以及處理方法

listener:指定監聽埠和回撥函式

訪問http://localhost:8888失敗

訪問http://localhost:8888/hello成功,hello world!

  • 靜態檔案
var express = require('express');
var app = express();
app.use(express.static('./static'));

use:指定使用的中介軟體

express.static:使用中介軟體,並指定靜態資料夾

use使用中介軟體必須在get等處理方法之前,否則訪問失敗。

靜態資料夾直接訪問失敗,但是可以直接訪問靜態資料夾內部檔案。

  • 路由
var express = require('express');
var app = express();
app.use(express.static('./static'));
var router = express.Router();
router.get('/a', function(request, response){
    response.end('this is page a');
});
router.get('/b', function(request, response){
    response.end('this is page b');
});
app.use('/page', router);
app.listen(8888, function(){
    console.log('server running on http://localhost:8888');
});

get:指定路徑和處理辦法

Router:同樣可以指定路由,單路由指定

use:引進路由中介軟體,可以進行路由管理

# 訪問地址
http://localhost:8888/page/a
http://localhost:8888/page/b

多級路由,可以通過型別,級別進行收納處理,便於維護。

  • 方式
var express = require('express');
var app = expres();
app.route('/route')
    .get(function(request, response){
        response.end('this is get');
    })
    .post(function(request, response){
        response.end('this is post');
    });
app.listen(8888, function(){
    console.log('server running on http://localhost:8888');
});

route:對於同一路徑,可以制定不同請求方式的處理辦法

# 發起http請求, 預設方式為GET
curl http://localhost:8888/route
# 宣告指定提交方式未GET  -X 指定提交方式
curl -X GET http://localhost:8888/route
# 宣告指定提交方式為POST
curl -X POST http://localhost:8888/route
  • 綜合
var express = require('express');
var app = express();
var staticFilePath = './static';
// 靜態檔案
app.use(express.static(staticFilePath));
// 直接路徑
app.get('/index', function(request, response){
    response.end('this is index');
});
// route 同路徑,多提交方式處理
app.route('/route')
    .get(function(request, response){
        response.end('this is route.get');
    })
    .post(function(request, response){
        response.end('this is route.post');
    });
var router = express.Router();
// 路由收納, 可用route多提交方式處理
router.route('/route')
    .get(function(request, response){
        response.end('this is router.route.get');
    })
    .post(function(request, response){
        response.end('this is router.route.post');
    });
// 新增路由管理
app.use('/router', router);
app.listen(8888, function(request, response){
    console.log('server running on http://localhost:8888');
});
  • 靜態檔案
  • 路徑設定
  • 路由管理
  • 多方式處理

後兩種隨意組合

  • 引數獲取
  1. 路徑引數
var express require('express');
var app = express();
app.param('name', function(request, response, next, name){
    console.log('receive name ' + name);
    request.name = name;
    cosole.log('set name into request');
    next();
    console.log('do next');
});
app.get('/param/:name', function(request, response){
    response.end('get name from request: ' + request.name);
});
app.listen(8888, function(){
    console.log('server running on http://localhost:8888');
});

param:指定攔截引數的處理辦法

request:請求

response:響應

next:繼續,放行,相當於java過濾器中的doFilter

name:引數的具體傳輸值

/param/:name:需提取的路徑引數用:param的形式進行宣告,設定的param方法會自動攔截處理。

# 訪問路徑
http://localhost:8888/param/godme
  1. param
app.get('/param', function(request, response){
   response.end('get name from request: ' + response.query.name); 
});
// GET  POST 都可以
# 訪問路徑
http://localhost/param?name=godme
  1. body
var express = require('express');
var parser = require('body-parser');
var urlEncodedParser = parser.urlencoded({extended:false});
var jsonParser = parser.json()
var app = express();
app.use(urlEncodedParser);
app.use(jsonParser);
app.post('/param', function(request, response){
    console.log('body: ' + request.body);
    response.end('receive name : ' + request.body.name);
})

直接訪問,攜帶引數 {name : godme}

  • 日誌
var morgan = require('morgan');
app.use(morgan());

morgan:日誌模組

更多問題請翻閱教學文件,或者官方文件

socket

  • server
const net = require('net');
const host = '127.0.0.1';
const port = 8888;
var server = net.createServer(function(socket){
    console.log('connect success', socket.remoteAddress, socket.remotePort);
    socket.on('data', function(data){
        console.log('receive from ', socker.remoteAddress, socket.remotePort);
        console.log('receive data ', data.toString());
        socket.write('nice , i am godme too !');
    });
});
server.listen(port, host, function(){
    console.log('tcp server running on tcp://', host, port);
})

nettcp連結模組

const:匯入的模組和特定變數,用const定義常量比較保險

createServer:建立server並設定回撥函式

socketserver實際上就是socket管理器,具體操作在socket上進行設定

onsocket都是事件驅動,繫結特定事件並設定回撥函式

writesocket寫資料

listen:監聽,並設定回撥函式

datatcp傳輸都是二進位制位元組,對應物件為buffer,想顯示字串需要toString

  • client
const net = require('net');
const host = '127.0.0.1';
const port = 8888;
var client = net.Socket();
client.on('data', function(data){
    console.log('receive from server:', data.toString());
})
client.connect(port, host, function(){
    console.log('connect to server', host, port);
    client.write('hello , i am godme!');
})

connect:發起連線動作。

port-host:比較怪異,先埠後地址,切記

總的來說,都是socket的呼叫。

  • 管理

服務端作為socket的管理,因為可能面臨多個連結。

  • 事件

通過事件設定觸發操作,具體圍繞socket

  • 角色

伺服器自動建立和管理socket,設定好動作即可。

客戶端相當於就是一個socket,免去管理的問題。

更多方法可以參看文件