最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs環(huán)境實(shí)現(xiàn)socket通信過程解析

 更新時(shí)間:2020年07月03日 10:24:54   作者:奔跑的太陽花  
這篇文章主要介紹了Nodejs環(huán)境實(shí)現(xiàn)socket通信過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

結(jié)構(gòu):

socket是應(yīng)用層和傳輸層的橋梁。(傳輸層之上的協(xié)議所涉及的數(shù)據(jù)都是在本機(jī)處理的,并沒進(jìn)入網(wǎng)絡(luò)中)

涉及數(shù)據(jù):

socket所涉及的數(shù)據(jù)是報(bào)文,是明文。

作用:

建立長久鏈接,供網(wǎng)絡(luò)上的兩個(gè)進(jìn)程通信。

nodejs環(huán)境下的簡單通信。

代碼:

serve:

// 1 引入模塊
const net = require('net');
// 2 創(chuàng)建服務(wù)器
let clientArr = [];
const server = net.createServer();
// 3 綁定鏈接事件
server.on('connection',(person)=>{
console.log(clientArr.length);
// 記錄鏈接的進(jìn)程
person.id = clientArr.length;
clientArr.push(person);
person.setEncoding('utf8');
// 客戶socket進(jìn)程綁定事件
person.on('data',(chunk)=>{
console.log(chunk);
clientArr.forEach((val)=>{
// 數(shù)據(jù)寫入全部客戶進(jìn)程中
val.write(chunk);
})
})
person.on('close',(p1)=>{
clientArr[p1.id] = null;
} )
person.on('error',(p1)=>{
clientArr[p1.id] = null;
})
})
server.listen(800);

client:

// 1 引入模塊
const net = require('net');
const readline = require('readline');
// 2 創(chuàng)建套接字和輸入輸出命令行
let rl = readline.createInterface({
// 調(diào)用std接口
input:process.stdin,
output:process.stdout
})
let client = new net.Socket();
// 3 鏈接
client.connect(800,'localhost');

client.setEncoding('utf8');
client.on('data',(chunk)=>{

})
client.on('error',(e)=>{
console.log(e.message);
})
// 綁定輸io流事件,獲取輸入輸出字符
rl.on('line',(mes)=>{
client.write(mes);
})

小結(jié):

server端:綁定連接事件 --> 在連接事件中管理客戶端進(jìn)程對(duì)象(1,把添加到數(shù)組中 2,處理客戶端發(fā)來的數(shù)據(jù))-->開啟端口監(jiān)聽請(qǐng)求 。

client端:創(chuàng)建連接服務(wù)器用的套接字 --> 連接服務(wù)器 。

socket建立的連接是長久連接。而應(yīng)用層的http協(xié)議是3次握手協(xié)議,是短連接。

socket工作原理和http類似,只是不規(guī)定斷開連接的時(shí)間??梢园裩ttp理解成一個(gè)人辦一件事情就跑一次連接流程。socket理解成只跑一次連接流程,只到把所有的事情都做完了才回去。

Socket主要作用是實(shí)現(xiàn)客戶端與服務(wù)端的實(shí)時(shí)通信保持通話,它不像ajax請(qǐng)求,每次對(duì)話完成后都會(huì)把連接斷開。Socket通信在

Node.js中實(shí)現(xiàn)其實(shí)很簡單,沒有想象中復(fù)雜,基本上只要懂得監(jiān)聽(.on)和推送(.emit)消息,即能實(shí)現(xiàn)Socket通信。

Socket服務(wù)端

在服務(wù)端使用Socket,需先引入socket.io模塊,該模塊詳細(xì)文檔可參考https://socket.io/

cnpm install socket.io

服務(wù)端實(shí)例代碼如下:

var server = app.listen(8081, "127.0.0.1", function() {
  var host = server.address().address;
  var port = server.address().port;
});
 
/********************socketIO********************/
var io = require('socket.io').listen(server);
// 建立連接
io.sockets.on('connection', function(socket) { //此處每個(gè)回調(diào)socket就是一個(gè)獨(dú)立的客戶端,通常會(huì)用一個(gè)公共列表數(shù)組統(tǒng)一管理
  // 連接斷開,如關(guān)閉頁面時(shí)觸發(fā)
  socket.on('disconnect', function() {
    console.log('已斷開鏈接');
  });
  // 監(jiān)聽客戶端發(fā)送的消息
  socket.on('clientmessage', function(data) {
    //推送給除自己外其他所有用戶的消息,類似于廣播
    socket.broadcast.emit('message', {
      text: '你的朋友上線了'
    });
  });
  //發(fā)送給自己的消息
  socket.emit('message', {
    text: '你上線了'
  });
});

上例中實(shí)現(xiàn)了4步:

1. 建立連接并添加斷開連接監(jiān)聽。

2. 建立clientmessage監(jiān)聽,當(dāng)客戶端發(fā)來該名稱的事件時(shí),服務(wù)器向除自己外其他的用戶廣播事件名稱為message的消息。

3.在剛建立連接時(shí),向客戶端推送事件名稱為message的消息。

其中主要應(yīng)用到的函數(shù)有5個(gè):

  • .on('connection', function(socket){ }):與客戶端建立連接時(shí)監(jiān)聽。
  • .on('disconnect', function(){ }):與客戶端斷開連接時(shí)監(jiān)聽。
  • .on('event-name', function(data) { }):監(jiān)聽客戶端發(fā)來的消息。
  • .broadcast.emit('event-name', { }):向除自己外的所有其他用戶廣播消息。
  • .emit('event-name', { }):僅向當(dāng)前連接的客戶端(自己)推送消息。

(注)相關(guān)客戶端的接口關(guān)聯(lián)請(qǐng)往下看客戶端的例子。

Socket客戶端

需先去下載socket.io.js文件,下載地址為:https://github.com/socketio/socket.io-client

客戶端實(shí)例代碼如下:

<!DOCTYPE html>
<html>
 
  <head>
    <meta charset="UTF-8">
    <title>socketio測試</title>
    <script>
      var tmp_html = '<link rel="stylesheet" href="../js/libs/bootstrap/3.3.7/css/bootstrap.css" rel="external nofollow" />';
      tmp_html += '<script src="../js/libs/jquery/3.2.1/jquery.js"><\/script>';
      tmp_html += '<script src="../js/libs/bootstrap/3.3.7/bootstrap.js"><\/script>';
      tmp_html += '<script src="../js/libs/socketio/socket.io.js"><\/script>';
      document.write(tmp_html);
      document.close();
    </script>
  </head>
 
  <body>
    <button id="btn">發(fā)送消息</button>
  </body>
  <script>
    var socket = io.connect('http://127.0.0.1:8081');
    socket.on('message', function(data) {
      console.log(data.text);
    })
 
    $("#btn").click(function() {
      socket.emit('clientmessage', {
        text: "hello"
      });
    });
  </script>
</html>

客戶端主要應(yīng)用到的函數(shù)有2個(gè):

  • .on('event-name', function(data) { }):監(jiān)聽服務(wù)端發(fā)來的消息。
  • .emit('event-name', { }):向服務(wù)端推送消息。

Socket即時(shí)通信就是那么簡單,而且在連接斷開時(shí)還會(huì)自動(dòng)重連。還有一種實(shí)現(xiàn)方法就是使用net模塊的套接字,可以直接查看Node.js文檔。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Nodejs對(duì)postgresql基本操作的封裝方法

    Nodejs對(duì)postgresql基本操作的封裝方法

    今天小編就為大家分享一篇Nodejs對(duì)postgresql基本操作的封裝方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Nodejs探秘之深入理解單線程實(shí)現(xiàn)高并發(fā)原理

    Nodejs探秘之深入理解單線程實(shí)現(xiàn)高并發(fā)原理

    這篇文章主要介紹了Nodejs單線程實(shí)現(xiàn)高并發(fā)原理,對(duì)Node.js感興趣的同學(xué),可以參考下
    2021-04-04
  • 使用nvm安裝node的過程及注意事項(xiàng)

    使用nvm安裝node的過程及注意事項(xiàng)

    在學(xué)習(xí)vue的過程中,最開始的就是要先安裝nodejs環(huán)境,此處記錄安裝過程及注意事項(xiàng),首先需要先卸載程序中卸載先前安裝過的nvm,刪除文件管理器中安裝的文件,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Node.js中HTTP模塊與事件模塊詳解

    Node.js中HTTP模塊與事件模塊詳解

    這篇文章主要詳細(xì)介紹了Node.js中HTTP模塊與事件模塊的相關(guān)資料,需要的朋友可以參考下
    2014-11-11
  • 快速了解Node中的Stream流是什么

    快速了解Node中的Stream流是什么

    今天小編就為大家分享一篇關(guān)于快速了解Node中的Stream流是什么,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Centos7 安裝Node.js10以上版本的方法步驟

    Centos7 安裝Node.js10以上版本的方法步驟

    這篇文章主要介紹了Centos7 安裝Node.js10以上版本的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • nodejs處理圖片的幾種方法總結(jié)(使用sharp、jimp及webconvert)

    nodejs處理圖片的幾種方法總結(jié)(使用sharp、jimp及webconvert)

    這篇文章主要給大家介紹了關(guān)于nodejs處理圖片的幾種方法,文中介紹的方法分別是sharp、jimp及webconvert,在開發(fā)過程中我們有時(shí)候需要對(duì)圖片進(jìn)行處理,給一個(gè)圖片添加水印、多個(gè)圖片合成為一圖片等操作,需要的朋友可以參考下
    2023-12-12
  • Express框架定制路由實(shí)例分析

    Express框架定制路由實(shí)例分析

    這篇文章主要介紹了Express定制路由,結(jié)合實(shí)例形式分析了express框架定制路由原理、用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • NodeJs?Express中間件超詳細(xì)講解

    NodeJs?Express中間件超詳細(xì)講解

    Express中間件本質(zhì)上就是一個(gè)function處理函數(shù),多個(gè)中間件之間,共享同一份req和res,我們就可以在上游的中間件中統(tǒng)一為req或者res對(duì)象添加自定義的屬性或方法,供下游的中間件或路由進(jìn)行使用,非常方便
    2022-08-08
  • npm 下載指定版本的組件方法

    npm 下載指定版本的組件方法

    今天小編就為大家分享一篇npm 下載指定版本的組件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評(píng)論

出国| 东乡| 乌海市| 锡林浩特市| 枣强县| 景宁| 宿松县| 酒泉市| 长葛市| 抚顺市| 长丰县| 武夷山市| 泸水县| 博客| 大城县| 湄潭县| 壤塘县| 清水县| 富裕县| 沁水县| 巩留县| 台中县| 龙里县| 涪陵区| 马鞍山市| 烟台市| 江阴市| 文水县| 碌曲县| 嘉禾县| 乐山市| 阜宁县| 博乐市| 大英县| 肥城市| 嵩明县| 涟水县| 中卫市| 尤溪县| 府谷县| 泸州市|