http://nodejs.cn/api/https.htmljavascript
HTTP難以實現實時數據傳輸 1長輪詢 ajax 2長鏈接html
websocket 協議可以讓 瀏覽器和服務器互相通訊,服務器也能主動通知客戶端java
原理: 利用http請求產生握手,http頭部憨厚webSocket協議的請求,握手以後,二者使用tcp協議進行交流 (qq的協議) 2.websocket協議須要瀏覽器和服務器同時支持
node 0 apache 7.02 nginx 1.3node
網址:http://socket.io/nginx
先要npm下載這個庫 npm install socket.ioweb
socket.io 還爲不支持webSocket協議瀏覽器,提供了長輪詢的透明模擬機制ajax
var http=require("")express
當server建立出來以後,調用io函數,取得一個socket對象 var socket=io();apache
var http = require("http"); var server = http.createServer(function(req,res){ res.end("你好"); }); var io = require('socket.io')(server); //監聽鏈接事件 io.on("connection",function(socket){ console.log("1個客戶端鏈接了"); }) server.listen(3000,"127.0.0.1");
寫完這句話以後,你就會發現,http://127.0.0.1:3000/socket.io/socket.io.js 就是一個js文件的地址了。 此時,在服務器上,app.js中就要書寫靜態文件呈遞程序,可以呈遞靜態頁面npm
1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6</head> 7<body> 8 <h1>我是index頁面,我引用了祕密script文件</h1> 9 <script type="text/javascript" src="/socket.io/socket.io.js"></script> 10 <script type="text/javascript"> 11 var socket = io(); 12 </script> 13</body> </html>
1var server = http.createServer(function(req,res){ 2 if(req.url == "/"){ 3 //顯示首頁 4 fs.readFile("./index.html",function(err,data){ 5 res.end(data); 6 }); 7 } 8});
至此,服務器和客戶端都有socket對象了。服務器的socket對象:
服務器端的:
1var io = require('socket.io')(server); 2//監聽鏈接事件 3io.on("connection",function(socket){ 4 console.log("1個客戶端鏈接了"); 5 socket.on("tiwen",function(msg){ 6 console.log("本服務器獲得了一個提問" + msg); 7 socket.emit("huida","吃了"); 8 }); 9});
每個鏈接上來的用戶,都有一個socket。 因爲咱們的emit語句,是socket.emit()發出的,因此指的是向這個客戶端發出語句。
廣播,就是給全部當前鏈接的用戶發送信息:
1//建立一個io對象 2var io = require('socket.io')(server); 3//監聽鏈接事件 4io.on("connection",function(socket){ // 服務器的socket是經過回調函數得到的 5 console.log("1個客戶端鏈接了"); 6 socket.on("tiwen",function(msg){ 7 console.log("本服務器獲得了一個提問" + msg); socket.emit("huida","吃了"); // 單個發送socket 8 io.emit("huida","吃了"); // 就是給全部當前鏈接的用戶發送信息: 9 }); 10});
io.on 監聽 io.emit 發送
express和socket.io配合使用
●Express框架能夠和Socket.IO搭配使用,可是不能像一般的Express程序那樣,用app.listen進行監聽了,而是採用一種固定的模式: var express = require('express'); var app = express(); var http = require('http').Server(app); var io = require('socket.io')(http);
http.listen(3000);
//session公式: var session = require('express-session'); app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true }));