成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

零基礎(chǔ)搭建網(wǎng)頁聊天室(socket.io使用教程)

madthumb / 2982人閱讀

摘要:本文實(shí)際為翻譯官方教程開始吧,我們做個(gè)聊天應(yīng)用在這個(gè)教程里,我們將制作一個(gè)簡單的網(wǎng)頁聊天應(yīng)用。它機(jī)會(huì)不要求你有任何關(guān)于或的基礎(chǔ),所以這份教程適合任何水平的開發(fā)者。介紹曾經(jīng)寫一個(gè)網(wǎng)頁聊天應(yīng)用可能會(huì)用到網(wǎng)頁工具套件,那時(shí)候非常困難。

本文實(shí)際為翻譯Socket.io官方教程——《Get Started: Chat application》

開始吧,我們做個(gè)聊天應(yīng)用!

在這個(gè)教程里,我們將制作一個(gè)簡單的網(wǎng)頁聊天應(yīng)用。它機(jī)會(huì)不要求你有任何關(guān)于Node.jsSocket.io的基礎(chǔ),所以這份教程適合任何水平的開發(fā)者。先看看Demo。

介紹

曾經(jīng)寫一個(gè)網(wǎng)頁聊天應(yīng)用可能會(huì)用到網(wǎng)頁工具套件LAMP、PHP,那時(shí)候非常困難。因?yàn)榭蛻舳艘粩嗟叵穹?wù)器發(fā)送請(qǐng)求,查看是否有信息變化,體驗(yàn)起來非常慢。

Socket通信是傳統(tǒng)解決實(shí)時(shí)通訊的一種方案,它提供了服務(wù)器和客戶端之間的雙向通信。

這就意味著,服務(wù)器可以把消息推送給客戶端,無論何時(shí)你發(fā)送了一個(gè)消息,客戶端都能接受到你的消息,并將它推送給其他連接的用戶。

網(wǎng)站框架

我們的第一個(gè)目標(biāo)是建立起一個(gè)簡單的HTML頁面(提供一個(gè)提交輸入信息的Form表單,和一個(gè)對(duì)話的列表)。我還還將通過Node.js的web框架express。首先,我們需要保證電腦已經(jīng)安裝了Node.js(如何安裝Node)。

第一步,我們先創(chuàng)建一個(gè)package.json文件,它用來描述這個(gè)項(xiàng)目。我推薦你把它放在一個(gè)新建的空文件夾內(nèi)。(我把我新建的文件夾名叫做chat-example.)

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

現(xiàn)在,為了簡單的package.json中的dependencies(依賴),我們將使用npm install --save命令。

npm install --save [email protected]

現(xiàn)在,我們已經(jīng)裝好了express,接下來,我們創(chuàng)建一個(gè)新的文件index.js來當(dāng)做我們的服務(wù)器端文件。

var app = require("express")();
var http = require("http").Server(app);

app.get("/", function(req, res){
  res.send("

Hello world

"); }); http.listen(3000, function(){ console.log("listening on *:3000"); });

這三段代碼可以解釋為:

Express初始化了app,讓它充當(dāng)一個(gè)HTTP服務(wù)器。

我們定義了一個(gè)路由處理器,當(dāng)我們輸入網(wǎng)址的時(shí)候,它進(jìn)入到文件根目錄。

我們讓HTTP服務(wù)器監(jiān)聽3000端口
這時(shí),如果你輸入
node index.js
你將會(huì)看到


如果你在瀏覽器中輸入

http://localhost:3000

提供HTML

到目前為止,我們index.js中用了res.send來傳遞了一段HTML字符串,如果我們將整段HTML代碼用這樣的方式傳遞,會(huì)顯得很奇怪,所以我們將創(chuàng)建index.html并傳遞它

我們用sendFile重新寫一下路由處理器

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

并創(chuàng)建index.html




  Socket.IO chat
  



  

    如果你重啟了這個(gè)進(jìn)程(按Ctrl/Cmd + C再輸入node index.js),刷新頁面就可以看到:

    使用Socket.io

    Socket.io由兩部分組成:

    一個(gè)Node.js HTTP服務(wù)器的應(yīng)用socket.io(此處原文為:A server that integrates with (or mounts on) the Node.JS HTTP Server: socket.io)

    一個(gè)客戶端的js庫socket.io-client
    我們只需安裝一個(gè)模塊就可以來使用:
    npm install --save socket.io

    這樣會(huì)自動(dòng)保存dependencypackage.json?,F(xiàn)在,我們開始編輯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("index.html");

    });

    io.on("connection", function(socket){

     console.log("a user connected");

    });

    http.listen(3000, function(){

     console.log("listening on *:3000");

    });
    注意到,我通過傳遞了http對(duì)象(HTTP服務(wù)器)新建了一個(gè)socket.io實(shí)例,接著,我對(duì)傳遞進(jìn)來的套接字(socket),監(jiān)聽connection事件,并將事件答應(yīng)到console。

    現(xiàn)在在index.html中,我在添加了如下語句:

    
    

    這會(huì)讓網(wǎng)頁加載socket.io-client,它會(huì)暴露一個(gè)io全局對(duì)象,并連接socket。

    注意:當(dāng)我調(diào)用io()時(shí),我沒有特別聲明任何url。因?yàn)樗J(rèn)連接這個(gè)頁面的host服務(wù)器。

    如果你重現(xiàn)啟動(dòng)服務(wù)器,你將會(huì)看到console輸出“a user connected”。多打開幾個(gè)頁面,你將會(huì)看到:

    每個(gè)socket同樣會(huì)觸發(fā)disconnect事件:

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

    這樣你刷新網(wǎng)頁的多次,你就會(huì)看到:

    觸發(fā)事件

    Socket.IO背后最主要的作用時(shí)可以讓服務(wù)器和客戶端發(fā)送和接受事件觸發(fā),任何能被編輯成JSON或二進(jìn)制的對(duì)象都可以傳遞。

    我們先來實(shí)現(xiàn)這種情況:用戶輸入信息,服務(wù)器端接收到chat message事件,這是index.html中的script應(yīng)該這樣寫:

    
    
    

    index.js,我們輸出chat message事件:

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

    下一個(gè)目標(biāo)就是由服務(wù)器觸發(fā)每一個(gè)客戶端的事件

    為了給每個(gè)客戶端發(fā)送時(shí)間,Socket.io提供io.emit

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

    如果你想給每個(gè)人發(fā)送消息,出了某個(gè)特定的socket連接,我們可以用boardcast標(biāo)示符:

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

    在我們這個(gè)項(xiàng)目中,為了簡便,我們給每個(gè)連接的用戶都發(fā)送消息

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

    在客戶端這一側(cè),當(dāng)我們捕獲到了chat message事件,我們將它體現(xiàn)在頁面中,所有的JavaScript如下:

    這時(shí)我們就完成了我們的聊天應(yīng)用,僅僅只有20行代碼?。?!

    后話

    當(dāng)然,學(xué)好前端,你還需要關(guān)注一個(gè)公眾號(hào)!——每日前端
    各位兄弟姐妹,共勉!

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79189.html

    相關(guān)文章

    • websocket搭建簡單的網(wǎng)頁天室框架

      摘要:我們要做一個(gè)網(wǎng)頁版的聊天室,當(dāng)一個(gè)人發(fā)送了消息時(shí),其他人怎么能看到這條信息呢有一個(gè)做法就是在網(wǎng)頁中不斷的運(yùn)行,發(fā)送給服務(wù)器,服務(wù)器不斷返回,當(dāng)有新的消息時(shí)顯示在頁面上。這樣做毫無疑問會(huì)產(chǎn)生大量的連接,對(duì)服務(wù)器的性能和帶寬都有影響。 http協(xié)議,是客戶端每發(fā)送一個(gè)request,服務(wù)器返回一個(gè)response,無法做到服務(wù)器主動(dòng)向客戶端發(fā)送數(shù)據(jù)。我們要做一個(gè)網(wǎng)頁版的聊天室,當(dāng)一個(gè)人發(fā)送...

      UsherChen 評(píng)論0 收藏0
    • websocket搭建簡單的網(wǎng)頁天室框架

      摘要:我們要做一個(gè)網(wǎng)頁版的聊天室,當(dāng)一個(gè)人發(fā)送了消息時(shí),其他人怎么能看到這條信息呢有一個(gè)做法就是在網(wǎng)頁中不斷的運(yùn)行,發(fā)送給服務(wù)器,服務(wù)器不斷返回,當(dāng)有新的消息時(shí)顯示在頁面上。這樣做毫無疑問會(huì)產(chǎn)生大量的連接,對(duì)服務(wù)器的性能和帶寬都有影響。 http協(xié)議,是客戶端每發(fā)送一個(gè)request,服務(wù)器返回一個(gè)response,無法做到服務(wù)器主動(dòng)向客戶端發(fā)送數(shù)據(jù)。我們要做一個(gè)網(wǎng)頁版的聊天室,當(dāng)一個(gè)人發(fā)送...

      scq000 評(píng)論0 收藏0
    • 教你用Vue漸進(jìn)式搭建天室,從JavaScript=>TypeScript

      摘要:前言這個(gè)輪子已經(jīng)有很多人造過了,為了不重復(fù)造輪子,我將本項(xiàng)目以三階段實(shí)現(xiàn)大家可以在中的查看純前端后端前端后端前端希望能給大家一個(gè)漸進(jìn)學(xué)習(xí)的經(jīng)驗(yàn)。 前言 Vue+Socket.io這個(gè)輪子已經(jīng)有很多人造過了,為了不重復(fù)造輪子,我將本項(xiàng)目以三階段實(shí)現(xiàn)(大家可以在github中的Releases查看): 純前端(Vuex) 后端+前端(JavaScript) 后端+前端(TypeScrip...

      skinner 評(píng)論0 收藏0
    • 個(gè)人分享--web前端學(xué)習(xí)資源分享

      摘要:前言月份開始出沒社區(qū),現(xiàn)在差不多月了,按照工作的說法,就是差不多過了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來說,差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議那么今天我就把看過的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區(qū),現(xiàn)在差不多9月了,按照工作的說法,就是差不多過了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來說,差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議!那么今天我就...

      sherlock221 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <