欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊(1)

 更新時(shí)間:2016年11月11日 08:42:02   作者:小兵快跑  
這篇文章主要介紹了iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊,WebSocket是web通信方式的一種,有需要的可以了解一下。

公司項(xiàng)目需要開發(fā)一個(gè)類似QQ、微信的即時(shí)IM聊天功能,做到實(shí)時(shí)監(jiān)控消息,需要用的技術(shù)是websocket。

概述WebSocket:

1.1 為什么我們需要WebSocket這樣的實(shí)時(shí)的通信協(xié)議?

WebSocket是web通信方式的一種,像我們熟知的HTTP協(xié)議也是web通信方式的一種。但是我們知道HTTP協(xié)議是一種無狀態(tài)的協(xié)議,其服務(wù)端本身不具備識(shí)別客戶端的能力,必須借助外部的一些信息比如說session和cookie,才能與特定的客戶端保持通信。也就是說我們所發(fā)送的每一個(gè)HTTP的請求都會(huì)帶上請求頭中一些相應(yīng)的信息還有cookie,這明顯會(huì)增加我們傳輸?shù)男畔⒌捏w量從而帶來一定的網(wǎng)絡(luò)延遲,對于一些對通信的實(shí)時(shí)性要求比較高的應(yīng)用來說就是不可忍受的了,比如說聊天程序或者是運(yùn)行在瀏覽器中的實(shí)時(shí)小游戲。最郁悶的卻還是這些頭信息和cookie往往對于服務(wù)器響應(yīng)客戶端的請求來說是多余的,也就是說雖然我每個(gè)請求都帶了這些信息,但是服務(wù)器與客戶端的交互過程中可能根本用不上這些信息。

為了改善HTTP請求的這種網(wǎng)絡(luò)延遲的情況,也出現(xiàn)了一些適應(yīng)不同需求的其他的[web通信]方式,比如說:輪詢,長輪詢(long-polling),數(shù)據(jù)流,EventSouce等等,WebSocket便是其中一種。

實(shí)際上大多數(shù)基于因特網(wǎng)(或者局域網(wǎng))的網(wǎng)絡(luò)鏈接通常都包含長連接和基于TCP套接字的雙向消息交換。但是TCP協(xié)議是屬于最底層的網(wǎng)絡(luò)通信協(xié)議了,讓一些不能信任的客戶端腳本去訪問底層的TCP套接字顯然是不太安全的,因此WebSocket實(shí)現(xiàn)了一種較為安全的方案,它允許客戶端腳本在客戶端和支持WebSocket協(xié)議的服務(wù)器之間創(chuàng)建雙向的套接字連接。從而使實(shí)時(shí)通信的某些網(wǎng)絡(luò)操作變得簡單。

1.2 WebSocket是如何工作的?

我們知道了WebSocket的主要作用是,允許服務(wù)器端與客戶端進(jìn)行全雙工(full-duplex)的實(shí)時(shí)通信。這里有個(gè)例子特別好:HTTP協(xié)議像發(fā)電子郵件,發(fā)出后必須等待對方回信;WebSocket則是像打電話,服務(wù)器端和客戶端可以同時(shí)向?qū)Ψ桨l(fā)送數(shù)據(jù),它們之間存著一條持續(xù)打開的數(shù)據(jù)通道。

1.Pod導(dǎo)入SocketRocket

platform :ios,'7.0'

target '白__Socket--Demo1' do

   pod 'SocketRocket', '~> 0.5.1'

end

2.導(dǎo)入對象SRWebSocket

#import "ViewController.h"
#import "SRWebSocket.h"
@interface ViewController ()<SRWebSocketDelegate>
@property(nonatomic,strong) SRWebSocket *webSocket;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];


}

//初始化
- (void)Reconnect{

  NSLog(@"1221---open");

  self.webSocket.delegate = nil;
  [self.webSocket close];

  self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://192.168.5.120:4141"]]];
  self.webSocket.delegate = self;
  self.title = @"Opening Connection...";

  [self.webSocket open];
}

- (void)viewWillAppear:(BOOL)animated{
  [self Reconnect];
}

- (void)viewDidDisappear:(BOOL)animated{
  // Close WebSocket
  self.webSocket.delegate = nil;
  [self.webSocket close];
  self.webSocket = nil;
 }

3.SRWebSocketDelegate

//連接成功
//代理方法實(shí)現(xiàn)
#pragma mark - SRWebSocketDelegate
- (void)webSocketDidOpen:(SRWebSocket *)webSocket{

  NSLog(@"Websocket Connected");
  self.title = @"Connected!";
 }
//連接失敗
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{
  NSLog(@":( Websocket Failed With Error %@", error);

  self.title = @"Connection Failed! (see logs)";
  self.webSocket = nil;
 }
//接收到新消息的處理
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
//  NSString *str1 = self.replyContent.text;
//  NSString *str2 = [str1 stringByAppendingFormat:@"%@\n",message];
//  self.replyContent.text = str2;

  NSLog(@"%@--askl",message);

 }
//連接關(guān)閉
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{
  NSLog(@"Closed Reason:%@",reason);
  self.title = @"Connection Closed! (see logs)";
  self.webSocket = nil;
 }
//該函數(shù)是接收服務(wù)器發(fā)送的pong消息,其中最后一個(gè)是接受pong消息的,
在這里就要提一下心跳包,一般情況下建立長連接都會(huì)建立一個(gè)心跳包,
用于每隔一段時(shí)間通知一次服務(wù)端,客戶端還是在線,這個(gè)心跳包其實(shí)就是一個(gè)ping消息,
我的理解就是建立一個(gè)定時(shí)器,每隔十秒或者十五秒向服務(wù)端發(fā)送一個(gè)ping消息,這個(gè)消息可是是空的
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload{

  NSString *reply = [[NSString alloc] initWithData:pongPayload encoding:NSUTF8StringEncoding];
  NSLog(@"%@",reply);
 }

#pragma mark - SendButton Response
- (IBAction)sendAction:(id)sender {
  [self.view endEditing:YES];
  // WebSocket
  if (self.webSocket) {

    [self.webSocket send:@"您好 !"];

  }
}

實(shí)現(xiàn)效果:

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

相關(guān)文章

  • 簡述iOS屬性中的內(nèi)存管理參數(shù)

    簡述iOS屬性中的內(nèi)存管理參數(shù)

    這篇文章主要介紹了簡述iOS屬性中的內(nèi)存管理參數(shù) 的相關(guān)資料,需要的朋友可以參考下
    2018-02-02
  • iOS仿郵箱大師的九宮格手勢密碼解鎖

    iOS仿郵箱大師的九宮格手勢密碼解鎖

    這篇文章主要為大家詳細(xì)介紹了iOS仿郵箱大師的手勢密碼解鎖的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • iOS NSCache和NSUrlCache緩存類實(shí)現(xiàn)示例詳解

    iOS NSCache和NSUrlCache緩存類實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了iOS NSCache和NSUrlCache緩存類實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • iOS 進(jìn)度條、加載、安裝動(dòng)畫的簡單實(shí)現(xiàn)

    iOS 進(jìn)度條、加載、安裝動(dòng)畫的簡單實(shí)現(xiàn)

    這篇文章主要介紹了iOS 進(jìn)度條、加載、安裝動(dòng)畫的簡單實(shí)現(xiàn),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • IOS實(shí)現(xiàn)點(diǎn)擊滑動(dòng)抽屜效果

    IOS實(shí)現(xiàn)點(diǎn)擊滑動(dòng)抽屜效果

    這篇文章主要為大家詳細(xì)介紹了IOS實(shí)現(xiàn)點(diǎn)擊滑動(dòng)抽屜效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • iOS開發(fā)使用JSON解析網(wǎng)絡(luò)數(shù)據(jù)

    iOS開發(fā)使用JSON解析網(wǎng)絡(luò)數(shù)據(jù)

    JSON是一種輕量級(jí)的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互,服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格式(文件下載除外)下面我們就看下在IOS開發(fā)中如何結(jié)合json呢
    2016-02-02
  • iOS應(yīng)用中使用AsyncSocket庫處理Socket通信的用法講解

    iOS應(yīng)用中使用AsyncSocket庫處理Socket通信的用法講解

    這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下
    2016-05-05
  • iOS視頻錄制(或選擇)壓縮及上傳功能(整理)

    iOS視頻錄制(或選擇)壓縮及上傳功能(整理)

    最新做的一個(gè)功能涉及到了視頻的錄制、壓縮及上傳功能,經(jīng)過大神的一番教導(dǎo),終于倒騰清楚了,今天小編把問題經(jīng)過記錄一下分享到腳本之家平臺(tái),供大家參考
    2017-03-03
  • iOS逆向教程之跟蹤函數(shù)調(diào)用詳解

    iOS逆向教程之跟蹤函數(shù)調(diào)用詳解

    這篇文章主要給大家介紹了關(guān)于iOS逆向教程之跟蹤函數(shù)調(diào)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • iOS開發(fā)中CALayer使用的基本教程

    iOS開發(fā)中CALayer使用的基本教程

    這篇文章主要介紹了iOS開發(fā)中CALayer使用的基本教程,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-11-11

最新評論