免费无码作爱视频,女厕厕露p撒尿八个少妇,精品人妻av区乱码,国产aⅴ爽av久久久久久

iOS應用中使用AsyncSocket庫處理Socket通信的用法

時間:2022-04-01 14:29:28 手機 我要投稿
  • 相關推薦

iOS應用中使用AsyncSocket庫處理Socket通信的用法

  用socket可以實現像QQ那樣發送即時消息的功能?蛻舳撕头⻊斩诵枰㈤L連接,在長連接的情況下,發送消息?蛻舳丝梢园l送心跳包來檢測長連接。

  在iOS開發中使用socket,一般都是用第三方庫AsyncSocket,不得不承認這個庫確實很強大。下載地址CocoaAsyncSocket。

  特性

  AsyncSocket類是支持TCP的。

  AsyncUdpSocket是支持UDP的。

  AsyncSocket是封裝了CFSocket和CFSteam的TCP/IP socket網絡庫。它提供了異步操作,本地cocoa類的基于delegate的完整支持。主要有以下特性:

  隊列的非阻塞的讀和寫,而且可選超時。你可以調用它讀取和寫入,它會當完成后告知你。

  自動的socket接收。如果你調用它接收連接,它將為每個連接啟動新的實例,當然,也可以立即關閉這些連接。

  委托(delegate)支持。錯誤、連接、接收、完整的讀取、完整的寫入、進度以及斷開連接,都可以通過委托模式調用。

  基于run loop的,而不是線程的。雖然可以在主線程或者工作線程中使用它,但你不需要這樣做。它異步的調用委托方法,使用NSRunLoop。委托方法包括socket的參數,可讓你在多個實例中區分。

  自包含在一個類中。你無需操作流或者socket,這個類幫你做了全部。

  支持基于IPV4和IPV6的TCP流。

  AsyncUdpSocket是UDP/IP socket網絡庫,包裝自CFSocket。它的工作很像TCP版本,只不過是用于處理UDP的。它包括基于非阻塞隊列的發送接收操作,完整的委托支持,基于runloop,自包含的類,以及支持IPV4和IPV6。

  使用AsyncSocket的時候可以做一層封裝,根據需求提供幾個接口出來。比如:連接、斷開連接、發送消息等等。還有接受消息,接受到的消息可以通過通知、代理、block等傳出去。

  下面簡單介紹一下對AsyncSocket使用.一般來說,一個用戶只需要建立一個socket長連接,所以可以用單例類方便使用。

  定義單列類:LGSocketServe

  LGSocketServe.h

  復制代碼 代碼如下:

  //

  // LGSocketServe.h

  // AsyncSocketDemo

  //

  #import

  #import "AsyncSocket.h"

  @interface LGSocketServe : NSObject

  + (LGSocketServe *)sharedSocketServe;

  @end

  LGSocketServe.m

  復制代碼 代碼如下:

  //

  // LGSocketServe.m

  // AsyncSocketDemo

  //

  #import "LGSocketServe.h"

  @implementation LGSocketServe

  static LGSocketServe *socketServe = nil;

  #pragma mark public static methods

  + (LGSocketServe *)sharedSocketServe {

  @synchronized(self) {

  if(socketServe == nil) {

  socketServe = [[[self class] alloc] init];

  }

  }

  return socketServe;

  }

  +(id)allocWithZone:(NSZone *)zone

  {

  @synchronized(self)

  {

  if (socketServe == nil)

  {

  socketServe = [super allocWithZone:zone];

  return socketServe;

  }

  }

  return nil;

  }

  @end

  建立socket長連接

  LGSocketServe.h

  復制代碼 代碼如下:

  @property (nonatomic, strong) AsyncSocket *socket; // socket

  // socket連接

  - (void)startConnectSocket;

  LGSocketServe.m

  //自己設定

  #define HOST @"192.168.0.1"

  #define PORT 8080

  //設置連接超時

  #define TIME_OUT 20

  - (void)startConnectSocket

  {

  self.socket = [[AsyncSocket alloc] initWithDelegate:self];

  [self.socket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];

  if ( ![self SocketOpen:HOST port:PORT] )

  {

  }

  }

  - (NSInteger)SocketOpen:(NSString*)addr port:(NSInteger)port

  {

  if (![self.socket isConnected])

  {

  NSError *error = nil;

  [self.socket connectToHost:addr onPort:port withTimeout:TIME_OUT error:&error];

  }

  return 0;

  }

  宏定義一下HOST、PORT、TIME_OUT,實現startConnectSocket方法。這個時候要設置一下AsyncSocket的代理AsyncSocketDelegate。當長連接成功之后會調用:

  復制代碼 代碼如下:

  - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port

  {

  //這是異步返回的連接成功,

  NSLog(@"didConnectToHost");

  }

  心跳

  LGSocketServe.h

  復制代碼 代碼如下:

  @property (nonatomic, retain) NSTimer *heartTimer; // 心跳計時器

  LGSocketServe.m

  - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port

  {

  //這是異步返回的連接成功,

  NSLog(@"didConnectToHost");

  //通過定時器不斷發送消息,來檢測長連接

  self.heartTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(checkLongConnectByServe) userInfo:nil repeats:YES];

  [self.heartTimer fire];

  }

  // 心跳連接

  -(void)checkLongConnectByServe{

  // 向服務器發送固定可是的消息,來檢測長連接

  NSString *longConnect = @"connect is here";

  NSData *data = [longConnect dataUsingEncoding:NSUTF8StringEncoding];

  [self.socket writeData:data withTimeout:1 tag:1];

  }

  在連接成功的回調方法里,啟動定時器,每隔2秒向服務器發送固定的消息來檢測長連接。(這個根據服務器的需要就可以了)

  斷開連接

  1,用戶手動斷開連接

  LGSocketServe.h

  復制代碼 代碼如下:

  // 斷開socket連接

  -(void)cutOffSocket;

  LGSocketServe.m

  -(void)cutOffSocket

  {

  self.socket.userData = SocketOfflineByUser;

  [self.socket disconnect];

  }

  cutOffSocket是用戶斷開連接之后,不在嘗試重新連接。

  2,wifi斷開,socket斷開連接

  LGSocketServe.m

  復制代碼 代碼如下:

  - (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err

  {

  NSLog(@" willDisconnectWithError %ld err = %@",sock.userData,[err description]);

  if (err.code == 57) {

  self.socket.userData = SocketOfflineByWifiCut;

  }

  }

  wifi斷開之后,會回調onSocket:willDisconnectWithError:方法,err.code == 57,這個時候設置self.socket.userData = SocketOfflineByWifiCut。

  重新連接

  socket斷開之后會回調:

  LGSocketServe.m

  復制代碼 代碼如下:

  - (void)onSocketDidDisconnect:(AsyncSocket *)sock

  {

  NSLog(@"7878 sorry the connect is failure %ld",sock.userData);

  if (sock.userData == SocketOfflineByServer) {

  // 服務器掉線,重連

  [self startConnectSocket];

  }

  else if (sock.userData == SocketOfflineByUser) {

  // 如果由用戶斷開,不進行重連

  return;

  }else if (sock.userData == SocketOfflineByWifiCut) {

  // wifi斷開,不進行重連

  return;

  }

  }

  在onSocketDidDisconnect回調方法里面,會根據self.socket.userData來判斷是否需要重新連接。

  發送消息

  LGSocketServe.h

  復制代碼 代碼如下:

  // 發送消息

  - (void)sendMessage:(id)message;

  LGSocketServe.m

  //設置寫入超時 -1 表示不會使用超時

  #define WRITE_TIME_OUT -1

  - (void)sendMessage:(id)message

  {

  //像服務器發送數據

  NSData *cmdData = [message dataUsingEncoding:NSUTF8StringEncoding];

  [self.socket writeData:cmdData withTimeout:WRITE_TIME_OUT tag:1];

  }

  //發送消息成功之后回調

  - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag

  {

  }

  發送消息成功之后會調用onSocket:didWriteDataWithTag:,在這個方法里可以進行讀取消息。

  接受消息

  LGSocketServe.m

  復制代碼 代碼如下:

  //設置讀取超時 -1 表示不會使用超時

  #define READ_TIME_OUT -1

  #define MAX_BUFFER 1024

  //發送消息成功之后回調

  - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag

  {

  //讀取消息

  [self.socket readDataWithTimeout:-1 buffer:nil bufferOffset:0 maxLength:MAX_BUFFER tag:0];

  }

  //接受消息成功之后回調

  - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

  {

  //服務端返回消息數據量比較大時,可能分多次返回。所以在讀取消息的時候,設置MAX_BUFFER表示每次最多讀取多少,當data.length < MAX_BUFFER我們認為有可能是接受完一個完整的消息,然后才解析

  if( data.length < MAX_BUFFER )

  {

  //收到結果解析...

  NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

  NSLog(@"%@",dic);

  //解析出來的消息,可以通過通知、代理、block等傳出去

  }

  [self.socket readDataWithTimeout:READ_TIME_OUT buffer:nil bufferOffset:0 maxLength:MAX_BUFFER tag:0];

  接受消息后去解析,然后可以通過通知、代理、block等傳出去。在onSocket:didReadData:withTag:回調方法里面需要不斷讀取消息,因為數據量比較大的話,服務器會分多次返回。所以我們需要定義一個MAX_BUFFER的宏,表示每次最多讀取多少。當data.length < MAX_BUFFER我們認為有可能是接受完一個完整的消息,然后才解析 。

  出錯處理

  LGSocketServe.m

  復制代碼 代碼如下:

  - (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err

  {

  NSData * unreadData = [sock unreadData]; // ** This gets the current buffer

  if(unreadData.length > 0) {

  [self onSocket:sock didReadData:unreadData withTag:0]; // ** Return as much data that could be collected

  } else {

  NSLog(@" willDisconnectWithError %ld err = %@",sock.userData,[err description]);

  if (err.code == 57) {

  self.socket.userData = SocketOfflineByWifiCut;

  }

  }

  }

  socket出錯會回調onSocket:willDisconnectWithError:方法,可以通過unreadData來讀取未來得及讀取的buffer。

  使用

  導入#import “LGSocketServe.h”

  復制代碼 代碼如下:

  LGSocketServe *socketServe = [LGSocketServe sharedSocketServe];

  //socket連接前先斷開連接以免之前socket連接沒有斷開導致閃退

  [socketServe cutOffSocket];

  socketServe.socket.userData = SocketOfflineByServer;

  [socketServe startConnectSocket];

  //發送消息 @"hello world"只是舉個列子,具體根據服務端的消息格式

  [socketServe sendMessage:@"hello world"];

【iOS應用中使用AsyncSocket庫處理Socket通信的用法】相關文章:

Windows7中使用Windows Live照片庫05-10

IOS7新功能Airdrop使用教程03-22

iOS11后臺應用刷新怎么設置04-05

ios9.3如何卸載iphone預裝應用05-05

ios7八門神器怎么使用06-04

iOS7.0.6如何正確維護和使用電池04-12

小米手環數據導入iphone ios8健康應用教程05-05

ios7.1.2怎么升級ios803-18

空調使用省電實用法則04-29

ios7如何降級到ios604-28

主站蜘蛛池模板: 亚洲精品久久久www小说| 图片区小说区av区| 亚洲午夜成人精品电影在线观看| 伊人成色综合人夜夜久久| 三年片在线观看免费大全电影| 99久久免费国产精品四虎| 午夜精品久久久久9999| 国产日产韩国精品视频| 无码男男作爱g片在线观看| 亚洲精品一区中文字幕乱码| 成人国产片女人爽到高潮| 日韩av无码中文无码不卡电影| 亚洲 欧美 动漫 少妇 自拍| 无码福利写真片在线播放| 男男啪啪激烈高潮cc漫画免费| 亚洲综合色噜噜狠狠网站超清| 国产真人无遮挡作爱免费视频| 57pao成人国产永久免费视频| 欧美3p两根一起进高清视频| 与子乱对白在线播放单亲国产| 精品国产一区二区三区色欲| 饥渴丰满少妇大力进入| 亚洲色爱免费观看视频| 国产av无码一区二区二三区j| 亚洲精品一区二区三区影院| 亚洲乱码高清午夜理论电影| 欧美老熟妇欲乱高清视频| 国产精品美女一区二区视频| 亚洲国产精品久久久久4婷婷| 亚洲 自拍 另类小说综合图区| 少妇真人直播免费视频| 肉色丝袜足j视频国产| 国产又黄又爽又色的免费| 亚洲色一区二区三区四区| 国产99视频精品免费视看6| 人妻无码精品久久亚瑟影视| 中文人妻熟妇乱又伦精品| 丰满人妻熟妇乱又伦精品劲| 国产精品偷伦视频观看免费| 国内精品久久久久久久影视| 人成午夜免费视频无码|