基礎函數
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
參考連接
- 第十二天 長連接(net和socket.io) https://www.jianshu.com/p/6966f12284b5
- WebSocket 與 Socket.IO https://zhuanlan.zhihu.com/p/23467317