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

iOS + node.js使用Socket.IO框架進(jìn)行實(shí)時通信示例

 更新時間:2017年04月14日 10:09:52   作者:mirrorZyb  
本篇文章主要介紹了iOS + node.js使用Socket.IO框架進(jìn)行實(shí)時通信示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

Socket.IO是一個基于WebSocket的實(shí)時通信庫,在主流平臺都有很好的支持,此文主要是通過一個小例子來演示Socket.IO的使用。

基礎(chǔ)環(huán)境搭建

新建一個文件夾(JS工程),創(chuàng)建一個package.json,復(fù)制以下內(nèi)容并保存。

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

然后執(zhí)行npm命令,安裝我們需要的依賴(Express和Socket.IO), 請確保你電腦已經(jīng)有node環(huán)境

在項(xiàng)目根目錄也就是package.json所在的目錄在終端執(zhí)行以下命令

npm install --save express@4.10.2

npm install --save socket.io

進(jìn)度條讀完后會多這么一個文件夾,此時Express和Socket.IO就已經(jīng)安裝好了,這和iOS的Cocopods差不多,以模塊化進(jìn)行加載。


然后新建一個index.js作為服務(wù)端,再建一個index.html作為客戶端。(為了方便演示,我這里有兩個客戶端,一個是iOS端,一個是瀏覽器端)

index.html

這也是官方Demo的演示界面,UI上沒做修改


代碼如下

<!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>

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');
});
http.listen(3000,function () {
  console.log('listien 3000');
});

開啟了一個Server,監(jiān)聽3000端口,然后回到項(xiàng)目根目錄,在終端輸入node index.js

如果出現(xiàn)listen 3000則表明服務(wù)開啟成功了,此時在瀏覽器訪問http://localhost:3000 就能看到index.html頁面了

iOS客戶端的集成

新建一個iOS工程,在終端cd到項(xiàng)目根目錄創(chuàng)建一個Podfile文件

vim Podfile

復(fù)制以下內(nèi)容

use_frameworks!

target 'SocketIO_Chat_Example' do #項(xiàng)目名
  pod 'Socket.IO-Client-Swift', '~> 8.2.0'
end

保存退出,執(zhí)行命令安裝依賴

pod install or pod install --verbose --no-repo-update

請確保已經(jīng)有cocopods環(huán)境

iOS端的UI


使用Socket.IO

此時我們的客戶端和服務(wù)端都已經(jīng)有了Socket.IO的環(huán)境了,接下來就是使用它進(jìn)行聊天了。

Socket.IO中事件的處理主要通過這兩個方法來實(shí)現(xiàn)的

on(_ event: String, callback: NormalCallback)

emit(_ event: String, _ items: AnyObject...)

on方法為接收事件的方法,emit為發(fā)送事件的方法

我們的需求是讓瀏覽器和iOS客戶端進(jìn)行單聊

服務(wù)端的處理

要想發(fā)送到指定的客戶端,需要知道當(dāng)前客戶端的id(Socket.IO的id,例:3t60BArlK47a2fA-AAAd),但是客戶端并不清楚,客戶端只知道我們自己定義的id,所以我們要將Socket.IO的Id和我們自己定義的id綁定并存儲起來。

var socketArray = new Array();

io.on('connection', function(socket){
  var islogin = false;
  console.log('**********新加入了一個用戶*********',socket.id);
  socket.on('login',function (userId) {
    if(islogin) return;
    socket.userId = userId;
    socketArray.push(socket);
    islogin = true;

  });
  socket.on('privateMessage',function (data) {
    console.log(data);
  })
  socket.on('chat message', function(data){
    var to  = data.toUser;
    var message = data.message;
    for(var i = 0;i<socketArray.length;i++){
      var receiveData = socketArray[i];
      if (receiveData.userId == to){
        io.to([receiveData.socketId]).emit('privateMessage',''+receiveData.userId+':'+message);
      }
    }
  });
  socket.on('disconnect',function () {
    console.log('***********用戶退出登陸************,'+socket.id);
  })
});

客戶端的處理

瀏覽器的處理

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
  var socket = io();
  socket.emit('login','30621');
  $('form').submit(function(){
    socket.emit('chat message',{'toUser':'30342','message':$('#m').val()} );
    $('#m').val('');
    return false;
  });
  socket.on('chat message', function(msg){
    $('#messages').append($('<li>').text(msg));
  });
  socket.on('privateMessage',function (msg) {
    $('#messages').append($('<li>').text(msg));
  });
</script>

iOS端的處理

iOS在初始化的時候需要一個config字典,config可以配置諸如log日志輸出等設(shè)置

- (SocketIOClient *)client{
  if (!_client) {
    NSURL* url = [[NSURL alloc] initWithString:@"http://localhost:3000"];
    _client = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];

  }
  return _client;
}

- (void)connection{

  [self.client on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
    NSLog(@"*************\n\niOS客戶端上線\n\n*************");
    [self.client emit:@"login" with:@[@"30342"]];
  }];
  [self.client on:@"chat message" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
    if (event[0] && ![event[0] isEqualToString:@""]) {
      [self.messageArray insertObject:event[0] atIndex:0];
      [self.messageTableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
    }
  }];
  [self.client on:@"privateMessage" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
    if (event[0] && ![event[0] isEqualToString:@""]) {
      [self.messageArray insertObject:event[0] atIndex:0];
      [self.messageTableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
    }
  }];
  [self.client on:@"disconnect" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
    NSLog(@"*************\n\niOS客戶端下線\n\n*************%@",event?event[0]:@"");
  }];
  [self.client on:@"error" callback:^(NSArray * _Nonnull event, SocketAckEmitter * _Nonnull ack) {
    NSLog(@"*************\n\n%@\n\n*************",event?event[0]:@"");
  }];
  [self.client connect];

}
//按鈕點(diǎn)擊事件
- (IBAction)sendMessage:(id)sender {
  if (self.inputView.text.length>0) {

    [self.client emit:@"chat message" with:@[@{@"toUser":@"30621",@"message":self.inputView.text}]];
    [self.messageArray insertObject:self.inputView.text atIndex:0];
    [self.messageTableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
    self.inputView.text = @"";
  }

}

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

相關(guān)文章

  • Node.js?應(yīng)用探索文件解壓縮示例詳解

    Node.js?應(yīng)用探索文件解壓縮示例詳解

    這篇文章主要為大家介紹了Node.js?應(yīng)用探索文件解壓縮示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Google官方支持的NodeJS訪問API,提供后臺登錄授權(quán)

    Google官方支持的NodeJS訪問API,提供后臺登錄授權(quán)

    Google官方支持的NodeJS集成客戶端,用以訪問Google APIs, 支持OAuth 2.0授信及登錄認(rèn)證。登錄以后即可在后臺訪問例如 Google Drive(云存儲), Google Analytics, Gmail等服務(wù)。
    2014-07-07
  • NodeJS實(shí)現(xiàn)微信公眾號關(guān)注后自動回復(fù)功能

    NodeJS實(shí)現(xiàn)微信公眾號關(guān)注后自動回復(fù)功能

    這篇文章主要為大家詳細(xì)介紹了NodeJS實(shí)現(xiàn)微信公眾號關(guān)注后自動回復(fù)功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • NodeJS和瀏覽器中this關(guān)鍵字的不同之處

    NodeJS和瀏覽器中this關(guān)鍵字的不同之處

    這篇文章主要給大家介紹了關(guān)于NodeJS和瀏覽器中this關(guān)鍵字不同的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • node.js中的Socket.IO使用實(shí)例

    node.js中的Socket.IO使用實(shí)例

    這篇文章主要介紹了node.js中的Socket.IO使用實(shí)例,本文講解了Socket.IO的安裝、結(jié)合express來構(gòu)建服務(wù)器、基本使用方法及一個網(wǎng)絡(luò)聊天室的完整案例,需要的朋友可以參考下
    2014-11-11
  • 教你快速搭建Node.Js服務(wù)器的方法教程

    教你快速搭建Node.Js服務(wù)器的方法教程

    Node.js是一套用來編寫高性能網(wǎng)絡(luò)服務(wù)器的JavaScript工具包,一系列的變化由此開始。這篇文章主要給大家介紹了如何快速搭建Node.Js服務(wù)器的方法教程,文中介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友下面來一起看看吧。
    2017-03-03
  • node中koa中間件機(jī)制詳解

    node中koa中間件機(jī)制詳解

    本篇文章主要主要介紹了node中koa中間件機(jī)制詳解,詳細(xì)的介紹了koa和兼容問題,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Node.js 使用 Express-Jwt和JsonWebToken 進(jìn)行Token身份驗(yàn)證的操作方法

    Node.js 使用 Express-Jwt和JsonWebToken 進(jìn)行Token身份

    這篇文章主要介紹了Node.js 使用 Express-Jwt和JsonWebToken 進(jìn)行Token身份驗(yàn)證的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • NodeJs 模仿SIP話機(jī)注冊的方法

    NodeJs 模仿SIP話機(jī)注冊的方法

    這篇文章主要介紹了NodeJs 模仿SIP話機(jī)注冊的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • package-lock.json解決依賴的版本管理使用詳解

    package-lock.json解決依賴的版本管理使用詳解

    這篇文章主要為大家介紹了package-lock.json解決依賴的版本管理使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評論

民和| 贵州省| 巴里| 北安市| 原平市| 临潭县| 垣曲县| 湘阴县| 龙游县| 重庆市| 武陟县| 陈巴尔虎旗| 阳泉市| 云南省| 惠东县| 镶黄旗| 石门县| 靖边县| 东平县| 安多县| 晋州市| 莫力| 那曲县| 家居| 比如县| 宜昌市| 巧家县| 芒康县| 新民市| 壤塘县| 建阳市| 玉树县| 宜良县| 霍州市| 资源县| 太仓市| 荥经县| 靖州| 双牌县| 巴林左旗| 加查县|