ionic2/3實(shí)時(shí)聊天思路(socket.js)

一覺起來所有的外網(wǎng)都不能訪問了阱冶,github都被墻了,郁悶滥嘴。熙揍。。算了氏涩,進(jìn)入正題

引入socket.js

可以使用cdn届囚,也可以下載到本地,這里我選擇的是下載到本地是尖,然后在src/index.html引入即可意系,這里我的路徑是:

  //建議:將之第一個(gè)引入,可以避免一些io未定義問題
  <!-- 引入socket.io -->
  <script src="assets/js/socket.js"></script>

集成服務(wù)(socket.service.ts)

由于可能會(huì)被多個(gè)頁面使用到饺汹,所以這里我們創(chuàng)建一個(gè)服務(wù)來減少重復(fù)的操作蛔添。
src下創(chuàng)建一個(gè)文件夾provider,然后新建一個(gè)文件socket.service.ts兜辞,
將此服務(wù)注入到app.component.ts中的provider迎瞧,寫入下列代碼:

import { Injectable } from '@angular/core';
declare const io;
@Injectable()
export class SocketService {
    url:string='http://10.11.163.178:3000/';
    socket:any=io(this.url);
    sendName(name){
        this.socket.emit('sendName',name);
    }
    //私聊
    send(msg,to){
        this.socket.emit('privateMsg', {msg:msg,to:to });
    }
    //群聊
    sendAll(msg){
        this.socket.emit('publicMsg', msg);
    }
    //接受信息
    waitMsg(){
        this.socket.on('privateMsg',(msg)=>{
            console.log(msg);
        })
        this.socket.on('publicMsg',(msg)=>{
            console.log(msg);
        })
    }
}
//注意:文中的url是指服務(wù)端的地址,例如我這里填寫的是我的局域網(wǎng)ip逸吵,端口3000凶硅。

Node服務(wù)端編寫(index.js)

實(shí)際中用戶名與id應(yīng)當(dāng)存入數(shù)據(jù)庫(kù)中便于記錄管理,這里我為了簡(jiǎn)化將它們放置在服務(wù)端的一個(gè)數(shù)組users[ ]中扫皱。

var users = [];//定義用戶合集
//定義數(shù)組的搜索方法
Array.prototype.find = function (value,type) {
  if(!type) type='name';
  for (var i = 0; i < this.length; i++) {
    if (this[i][type] == value) return this[i];
  }
  return null;
}
//定義數(shù)組的移除方法
Array.prototype.remove = function (item) {
  for (var i = 0; i < this.length; i++) {
    if (this[i].name == item.name){
      this.splice(i,1);
      return ;
    }
  }
  return null;
}
io.on('connection', function (socket) {
  var id = socket.id;
  console.log('id:' + id);
  //接收用戶名
  socket.on('sendName', function (name) {
    users.push({ id: id, name: name });
    console.log(users);
    console.log(name + '上線了');
  });
  //斷開連接時(shí)移出
  socket.on('disconnect', function () {
    console.log(socket.id);
    var user = users.find(socket.id,'id');
    if (user) {
      users.remove(user);
      console.log(user.name + '已被移出');
    }
  });
  //私聊消息
  socket.on('privateMsg', function (info) {
    console.log(users);
    var user = users.find(info.to);
    if (user) {
      var id = user.id;
      io.sockets.connected[id].emit('privateMsg', info.msg);
    }
    else console.log('目標(biāo)角色已下線');
  })
  //全體消息
  socket.on('publicMsg', function (msg) {
    socket.broadcast.emit('publicMsg', msg);
  });

客戶端引用

chat.ts

這里作一個(gè)簡(jiǎn)單的示范足绅,只寫出關(guān)鍵代碼


export class ChatPage {
  //from和to均需自己定義,這里只是示范
  from:string='張三';
  to:string='李四';
  constructor(public ss:SocketService) {
  }
  ionViewDidLoad() {
    //進(jìn)入頁面時(shí)將自己用戶名發(fā)送給服務(wù)器
    this.ss.sendName(this.from);
    this.ss.waitMsg();
    console.log('ionViewDidLoad ChatPage');
  }
  send(msg,to){
    this.ss.send(msg,this.to);
  }
  sendAll(msg){
    this.ss.sendAll(msg);
  }
}

注意: 這里為了簡(jiǎn)化韩脑,waitMsg()函數(shù)在頁面載入時(shí)觸發(fā)氢妈。實(shí)際應(yīng)用應(yīng)該注入進(jìn)app.component.ts中,platform.ready()時(shí)就應(yīng)該觸發(fā)段多。這樣可以防止多次載入頁面多次定義waitMsg()首量,進(jìn)而收到重復(fù)的消息。該消息次數(shù)每次遞增1!

chat.html

<button ion-button (click)="send('你好')">send</button>
<button ion-button (click)="sendAll('你好')">sendAll</button>

文章到此結(jié)束了加缘,想關(guān)注我進(jìn)一步動(dòng)態(tài)的可以關(guān)注我的Github
有問題可以在評(píng)論下指出粥航,樓主還是初學(xué)者危队,不足之處望不吝賜教涂佃,感謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹬铺,一起剝皮案震驚了整個(gè)濱河市仿贬,隨后出現(xiàn)的幾起案子檬贰,更是在濱河造成了極大的恐慌握牧,老刑警劉巖诲泌,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件合瓢,死亡現(xiàn)場(chǎng)離奇詭異市俊,居然都是意外死亡杨凑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門摆昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撩满,“玉大人,你說我怎么就攤上這事绅你∷帕保” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵忌锯,是天一觀的道長(zhǎng)伪嫁。 經(jīng)常有香客問我,道長(zhǎng)偶垮,這世上最難降的妖魔是什么张咳? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮似舵,結(jié)果婚禮上脚猾,老公的妹妹穿的比我還像新娘。我一直安慰自己砚哗,他們只是感情好龙助,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著频祝,像睡著了一般泌参。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上常空,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音盖溺,去河邊找鬼漓糙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烘嘱,可吹牛的內(nèi)容都是我干的昆禽。 我是一名探鬼主播蝗蛙,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼醉鳖!你這毒婦竟也來了捡硅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤盗棵,失蹤者是張志新(化名)和其女友劉穎壮韭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纹因,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喷屋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞭恰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屯曹。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惊畏,靈堂內(nèi)的尸體忽然破棺而出恶耽,到底是詐尸還是另有隱情,我是刑警寧澤颜启,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布驳棱,位于F島的核電站,受9級(jí)特大地震影響农曲,放射性物質(zhì)發(fā)生泄漏社搅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一乳规、第九天 我趴在偏房一處隱蔽的房頂上張望形葬。 院中可真熱鬧,春花似錦暮的、人聲如沸笙以。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猖腕。三九已至,卻和暖如春恨闪,著一層夾襖步出監(jiān)牢的瞬間倘感,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工咙咽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留老玛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜡豹,于是被迫代替她去往敵國(guó)和親麸粮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容