websocket項目 搭建node專題及常見問題 - CSDN

2021-01-07 CSDN技術社區
Web框架

第一個目標是設置一個簡單的HTML網頁,用於提供表單和消息列表。我們將為此目的使用Node.JS Web框架express。確保已安裝Node.JS。

首先,讓我們創建一個package.json描述我們項目的清單文件。我建議你把它放在一個專門的空目錄中(我會打電話給我chat-example)。

{  "name": "socket-chat-example",  "version": "0.0.1",  "description": "my first socket.io app",  "dependencies": {}}

現在,為了輕鬆填充dependencies我們需要的東西,我們將使用npm install --save:

npm install --save express@4.15.2

現在已經安裝了express,我們可以創建一個index.js將設置我們的應用程式的文件。

var app = require('express')();var http = require('http').createServer(app);app.get('/', function(req, res){  res.send('<h1>Hello world</h1>');});http.listen(3000, function(){  console.log('listening on *:3000');});

這轉化為以下內容:

Express初始化app為可以提供給HTTP伺服器的函數處理程序(如第2行所示)。我們定義一個路由處理程序/,當我們訪問我們的網站時,它會被調用我們使http伺服器偵聽埠3000。

如果你跑步,node index.js你應該看到以下內容:

如果您將瀏覽器指向http://localhost:3000:

提供HTML

到目前為止,index.js我們正在調用res.send並傳遞一個HTML字符串。如果我們將整個應用程式的HTML放在那裡,我們的代碼看起來會很混亂。相反,我們將創建一個index.html文件並提供服務。

讓我們重構我們的路由處理程序來sendFile代替:

app.get('/', function(req, res){  res.sendFile(__dirname + '/index.html');});

並填充index.html以下內容:

<!doctype html><html>  <head>    <title>Socket.IO chat</title>    <style>      * { margin: 0; padding: 0; box-sizing: border-box; }      body { font: 13px Helvetica, Arial; }      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }      #messages { list-style-type: none; margin: 0; padding: 0; }      #messages li { padding: 5px 10px; }      #messages li:nth-child(odd) { background: #eee; }    </style>  </head>  <body>    <ul id="messages"></ul>    <form action="">      <input id="m" autocomplete="off" /><button>Send</button>    </form>  </body></html>

如果您重新啟動該過程(通過按Ctrl + C並node index再次運行)並刷新頁面,它應如下所示:

集成Socket.IO

Socket.IO由兩部分組成:

在開發過程中,socket.io正如我們所見,我們會自動為客戶服務,所以現在我們只需要安裝一個模塊:

npm install --save socket.io

這將安裝模塊並添加依賴項package.json。現在讓我們編輯index.js添加它:

var app = require('express')();var http = require('http').Server(app);var io = require('socket.io')(http);app.get('/', function(req, res){  res.sendFile(__dirname + '/index.html');});io.on('connection', function(socket){  console.log('a user connected');});http.listen(3000, function(){  console.log('listening on *:3000');});

請注意,我socket.io通過傳遞http(HTTP伺服器)對象來初始化新實例。然後我在connection事件上監聽傳入的套接字,然後將其記錄到控制臺。

現在在index.html中,我在以下內容之前添加以下代碼段</body>:

<script src="/socket.io/socket.io.js"></script><script>  var socket = io();</script>

這就是加載它所需的全部內容socket.io-client,它暴露了io全局(和端點GET /socket.io/socket.io.js),然後連接。

如果您想使用本地版本的客戶端JS文件,可以在以下位置找到它node_modules/socket.io-client/dist/socket.io.js。

請注意,我在調用時沒有指定任何URL io(),因為它默認嘗試連接到為頁面提供服務的主機。

如果您現在重新加載伺服器和網站,您應該看到控制臺列印「用戶已連接」。

嘗試打開幾個標籤,您會看到幾條消息:

[圖片上傳失敗...(image-bf7c81-1559199685037)]

每個插座也會觸發一個特殊disconnect事件:

io.on('connection', function(socket){  console.log('a user connected');  socket.on('disconnect', function(){    console.log('user disconnected');  });});

然後,如果您多次刷新選項卡,則可以看到它的運行情況:

發出事件

Socket.IO背後的主要思想是,您可以使用您想要的任何數據發送和接收您想要的任何事件。任何可以編碼為JSON的對象都可以,並且也支持二進位數據。

讓我們這樣做,以便當用戶鍵入消息時,伺服器將其作為chat message事件獲取。將script在S部件index.html現在應該如下所示:

<script src="/socket.io/socket.io.js"></script><script src="https://code.jquery.com/jquery-1.11.1.js"></script><script>  $(function () {    var socket = io();    $('form').submit(function(e){      e.preventDefault(); // prevents page reloading      socket.emit('chat message', $('#m').val());      $('#m').val('');      return false;    });  });</script>

而在index.js我們列印出的chat message事件:

io.on('connection', function(socket){  socket.on('chat message', function(msg){    console.log('message: ' + msg);  });});

結果應如下視頻:

廣播

下一個目標是讓我們從伺服器向其他用戶發出事件。

為了向所有人發送活動,Socket.IO給了我們io.emit:

io.emit('some event', { for: 'everyone' });

如果你想向除了某個套接字以外的所有人發送消息,我們有broadcast標誌:

io.on('connection', function(socket){  socket.broadcast.emit('hi');});

在這種情況下,為了簡單起見,我們會將消息發送給所有人,包括發件人。

io.on('connection', function(socket){  socket.on('chat message', function(msg){    io.emit('chat message', msg);  });});

在我們捕獲chat message事件時,在客戶端,我們將其包含在頁面中。現在,客戶端JavaScript代碼總數達到:

<script>  $(function () {    var socket = io();    $('form').submit(function(e){      e.preventDefault(); // prevents page reloading      socket.emit('chat message', $('#m').val());      $('#m').val('');      return false;    });    socket.on('chat message', function(msg){      $('#messages').append($('<li>').text(msg));    });  });</script>

這完成了我們的聊天應用程式,大約20行代碼!這就是它的樣子:

相關焦點

  • 搭建websocket消息推送服務,必須要考慮的幾個問題
    這次主要從搭建websocket服務的基本功能和特性方面做一些分享,下次有機會再從構建一個高可用websocket時要面對的高並發,海量消息,集群容災,橫向擴展,以及自動化運維等方面進更多的分享。最好的方式就是構建一個能夠兼容所有主流瀏覽器、小程序和APP,以及uni-app、vue、react-native等目前常見的各種前端框架的客戶端SDK,這樣不論公司的各個項目使用什麼樣的前端技術,都能夠快速的集成websocket服務。
  • redis 槽是什麼專題及常見問題 - CSDN
    ,需要nodes次網絡時間,大大減少了網絡時間開銷3.6.3 並行IO並行IO是對串行IO的一個優化,把key分組之後,根據節點數量啟動對應的線程數,根據多線程模式並行向node節點請求數據,只需要1次網絡時間3.6.4 hash_tag將key進行hash_tag的包裝,然後把tag用大括號括起來,保證所有的key只向一個node
  • github覆蓋本地專題及常見問題 - CSDN
    /SpoonLabs/nopol.git)git remote add upstream https://github.com/SpoonLabs/nopol.git # 添加github原項目的地址git remote -v # 再次查看本項目的遠程目錄,發現已經包含原項目地址git branch -a # 這時候再次查看項目分支,發現有remote:march2017 這個分支存在,但是不在本地
  • 復盤node項目中遇到的13+常見問題和解決方案
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫筆者之前陸陸續續接手過幾個nodejs項目, 也參與過幾個有點意思的nodejs開源項目, 最近把其中遇到的一些問題和解決方案做一個梳理, 避免大家繼續踩坑.
  • python 爬蟲 網頁正文專題及常見問題 - CSDN
    noise_node_list 的值是一個列表,裡面是一個或多個 XPath:extractor = GeneralNewsExtractor()extractor.extract(html, noise_node_list=['//div[@]', '//*[@style="display:none
  • c#引用包專題及常見問題 - CSDN
    不過,對 Unity C# 項目來說,你並不能直接引用 dll,也不能直接使用自帶的 NuGet 包管理器完成 NuGet 包安裝。本文介紹原因和真正的引用方法。但在 Unity 項目裡面,你可能要改變這一觀念——因為 Unity 項目裡面實際上並不存在 sln 和 csproj 文件。
  • getztreeobj專題及常見問題 - CSDN
    setCallback({onClick:zTreeOnLeftClick,onRightClick:zTreeOnRightClick}) .initZtree({},function(treeObj){orgTree = treeObj}); orgTree = $.fn.zTree.getZTreeObj("orgTree"); var nodes = orgTree.getNodes(); var node
  • workerman搭建websocket入門教程,簡單實用
    後端能實現websocket的語方很多,例如Node.js,Go,Python,dotnet core,java。websocket與http的區別當然php也可以做到,只是要依賴這篇要展開說的Workerman。
  • nodejs windows環境下搭建
    目前,Node.js是在前端開發中十分受歡迎,它是一套用來編寫高性能網絡伺服器的JavaScript工具包,官網中介紹:Node.js 是一個基於Chrome JavaScript 運行時建立的一個平臺, 用來方便地搭建快速的 易於擴展的網絡應用; Node.js 藉助事件驅動, 非阻塞I
  • bootstrap css ztree專題及常見問題 - CSDN
    if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return; var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='add node
  • java 異步保存資料庫專題及常見問題 - CSDN
    Redis集群中的每個node(節點)負責分攤這16384個slot中的一部分,也就是說,每個slot都對應一個node負責處理。當動態添加或減少node節點時,需要將16384個槽做個再分配,槽中的鍵值也要遷移。當然,這一過程,在目前實現中,還處於半自動狀態,需要人工介入。
  • c++信號與槽專題及常見問題 - CSDN
    開源庫下載:包含說明文檔,源碼,實例:https://download.csdn.net/download/u012372584/131624962、直接編譯會有錯誤,需要對源碼中的一句進行更改:將第419行 :typedef sender_set::const_iterator const_iterator; 更改為:typedef typename sender_set
  • mnist tensorflow 預測專題及常見問題 - CSDN
    minor: 2 memoryClockRate(GHz): 1.076pciBusID: 0000:09:00.0totalMemory: 11.93GiB freeMemory: 11.81GiB2019-06-02 11:17:12.769954: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:897] successful NUMA node
  • material vue專題及常見問題 - CSDN
    $ npm install -g vue-cli$ vue init vuematerial/webpack my-project$ cd my-project$ npm install$ npm run dev 安裝遇到的問題https:/
  • Hive On LLAP搭建&常見問題
    <property> <name>hadoop.registry.zk.quorum</name> <value>node01:2181,node02:2181,node03:2181&
  • SpringBoot+Netty+Websocket整合案例(實現基本的聊天功能)
    之前使用Springboot整合了websocket,實現了一個後端向前端推送信息的基本小案例,這篇文章主要是增加了一個新的框架就是Netty,實現一個高性能的websocket伺服器,並結合前端代碼,實現一個基本的聊天功能。你可以根據自己的業務需求進行更改。
  • 使用node轉發請求
    需求vue 項目開發過程中,接口跨域是一個很常見的問題。在開發時候可以用 vue 自帶的 proxy 可以輕鬆解決。生產環境下,前端項目往往是部署在後端項目下,不會存在跨域的問題,接口前綴可以忽略。
  • f檢驗 matlab專題及常見問題 - CSDN
    15.71985 15.91986 15.71987 16.71988 15.31989 16.11990 16.2MATLAB實現參考網上多個代碼可得https://www.ilovematlab.cn/thread-246993-1-1.htmlhttps://blog.csdn.net
  • Node.js 學習資料和教程(值得收藏)
    >Groupon拋棄Rails,轉向Node.js  經驗分享SDCC講師專訪:淘寶樸靈談Node.jsNode.js的核心與紅利QCon北京2013 Node.js專題出品人樸靈專訪一個周末掌握IT前沿技術之node.js篇用node+express搭建多人博客教程系列Node.js靜態文件伺服器實戰人人和微博登錄模塊的實現
  • Spring Boot 集成 WebSocket
    在一次項目開發中,使用到了Netty網絡應用框架,以及MQTT進行消息數據的收發,這其中需要後臺來將獲取到的消息主動推送給前端,於是就使用到了MQTT,特此記錄一下。 一、什麼是websocket? WebSocket協議是基於TCP的一種新的網絡協議。