Socket和WebSocket使用(nodejs)

基礎函數

trim()

  • 去除頭尾字符串

  • 不會改變原始字符串

    var str = "    hello world   "
    console.log(str.trim())
    coneole.log(str)
    

net

  • net 模塊提供一個原始的TCP/IP socket接口。
  • http模塊在net模塊的基礎之上實現了HTTP協議。

socket 類

socket類同時用在 net模塊的客戶端和服務器端,它是Stream的子類,即可讀也可寫,當有數據要讀出來時, 觸發data事件,當要發送輸出數據時它有write(),end()函數。

server 端

var  net = require('net')

net.createServer((socket) => {
    socket.write('Hello World!\r\n')
    socket.end()
}).listen(1337)

console.log('Listen on port 1337!')

client 端

var net = require('net')

var socket = net.connect({host: process.argv[2], port: 22})
socket.setEcoding('utf8')
socket.once('data',(chunk) => {
    console.log('SSH server version:%j', chunk.trim())
    socket.end();
})

socket.pipe()

var  net = require('net')

net.createServer((socket) => {
    console.log('socket connect')

    socket.on('data',(data) => {
        console.log('"data" event',data)
    })
    socket.on('end',() =>{
        console.log('"end" event')
    })
    socket.on('close',() =>{
        console.log('"close event')
    })
    socket.on('error',(e) => {
        console.log('"error" event',e)
    })
    socket.pipe(socket)

}).listen(1337)

console.log('Listen on port 1337!')
  • net.connect()

指定一個 host, port 值的配置項參數,並返回一個socket實例,返回的socket 開始並沒有連接到服務器上, 所以一般要在作神魔事之前監聽connect事件

var net = require('net'),
    host = process.argv[2],
    port = Number(process.argv[3])

var socket = net.connect(port,host)

socket.on('connect',() => {
    process.stdin.pipe(socket)
    socket.pipe(process.stdout)
    process.stdin.resume()
})
socket.on('end'() =>{
    process.stdin.pause()
})


WebSocket

WebSocket 協議本質上是一個基於TCP的協議,它由通信協議和API 組成,能夠在瀏覽器和服務器之間建立雙向連接,以基於 事件的方式,賦予瀏覽器實時通信的能力。雙向通信,服務器端和客戶端之間可以同時發送並響應請求,而不在像HTTP的請求和響應。

與 HTTP 的關係

  • HTTP 協議是一個懶惰的協議,server 只有在接收到請求時纔會作出反應。
  • 兩者都是應用層協議,都是基於TCP 協議,與HTTP 兼容,卻不融於HTTP 協議,僅作爲 HTML5的一部分,
  • websocket建立連接需要藉助HTTP 協議,建立好後,client 與 server 的雙向通信就與HTTP無關了。

與socket 的不同

WebSocekt 是 HTML5 規範中的一部分,其借鑑了 socket 的思想, 爲 client 和 server 之間提供了類似的雙向通信機制。 同時,WebSocket 又是一種新的應用層協議,包含一套標準的 API; 而 socket 並不是一個協議,而是一組接口,其主要方便大家直接使用更底層的協議(比如 TCP 或 UDP)

socket.io

socket.io 是一個開源的websocket庫,它通過nodejs 實現websocket服務端,同時也提供客戶端js庫。 socket.io 支持 websocket,htmlfile,xhr-polling,jsonp-polling,協議。

npm install --save express
npm install --save socket.io

websocket server

var app = require('express')(),
    http = require('http').Server(app),
    io = require('socket.io')(http)

app.get('/',(req,res) =>{
    res.send('<h1>Welcome Realtime Server</h1>')
})

var onlineUsers = {},
    onlineClient = 0

io.on('connection',(socket) =>{
    console.log('a user connected')
    socket.on('login',(obj) =>{
        io.emit('login',{onlineUsers:onlineUsers,onlineClient:onlineClient,user:obj})
        console.log(obj.username + 'join')
    })

    socket.on('disconnect',() =>{
        if (onlineUsers.hasOwnProperty(socket.name)){
            io.emit('logout',{onlineUsers:onlineUsers,onlineClient,onlineClient,user:obj})
            console.log(obj.username + 'out')
        }
    })

    socket.on('message',(obj) =>{
        io.emit('message',obj)
        console.log(obj.username + 'say : ' + obj.content)
    })
})

http.listen(3000,()=>{
    console.log('listening on 3000')
})

websocket client

參考連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章