ios原生的socket用起來不是很直觀,所以我用的是AsyncSocket這個第三方庫,對socket的封裝比較好,只是好像沒有帶外傳輸(out—of-band) 如果你的伺服器需要傳送帶外資料,可能得想下別的辦法
環境
下載AsyncSockethttps://github.com/robbiehanson/CocoaAsyncSocket類庫,將RunLoop資料夾下的AsyncSocket.h, AsyncSocket.m, AsyncUdpSocket.h, AsyncUdpSocket.m 檔案複製到自己的project中
新增CFNetwork.framework, 在使用socket的檔案頭
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <unistd.h>
使用
1. socket 連線
即時通訊最大的特點就是實時性,基本感覺不到延時或是掉線,所以必須對socket的連線進行監視與檢測,在斷線時進行重新連線,如果使用者退出登入,要將socket手動關閉,否則對伺服器會造成一定的負荷。
一般來說,一個使用者(對於ios來說也就是我們的專案中)只能有一個正在連線的socket,所以這個socket變數必須是全域性的,這裡可以考慮使用單例或是AppDelegate進行資料共享,本文使用單例。如果對一個已經連線的socket物件再次進行連線操作,會丟擲異常(不可對已經連線的socket進行連線)程式崩潰,所以在連線socket之前要對socket物件的連線狀態進行判斷
使用socket進行即時通訊還有一個必須的操作,即對伺服器傳送心跳包,每隔一段時間對伺服器傳送長連線指令(指令不唯一,由伺服器端指定,包括使用socket傳送訊息,傳送的資料和格式都是由伺服器指定),如果沒有收到伺服器的返回訊息,AsyncSocket會得到失去連線的訊息,我們可以在失去連線的回撥方法裡進行重新連線。
先建立一個單例,命名為Singleton
Singleton.h
// Singleton.h#import "AsyncSocket.h"#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \staticdispatch_once_t onceToken = 0; \
__strongstaticid sharedInstance = nil; \
dispatch_once(&onceToken, ^{ \
sharedInstance = block(); \
}); \
return sharedInstance; \
@interfaceSingleton : NSObject+ (Singleton *)sharedInstance;
@end
Singleton.m
ios原生的socket用起來不是很直觀,所以我用的是AsyncSocket這個第三方庫,對socket的封裝比較好,只是好像沒有帶外傳輸(out—of-band) 如果你的伺服器需要傳送帶外資料,可能得想下別的辦法
環境
下載AsyncSockethttps://github.com/robbiehanson/CocoaAsyncSocket類庫,將RunLoop資料夾下的AsyncSocket.h, AsyncSocket.m, AsyncUdpSocket.h, AsyncUdpSocket.m 檔案複製到自己的project中
新增CFNetwork.framework, 在使用socket的檔案頭
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <unistd.h>
使用
1. socket 連線
即時通訊最大的特點就是實時性,基本感覺不到延時或是掉線,所以必須對socket的連線進行監視與檢測,在斷線時進行重新連線,如果使用者退出登入,要將socket手動關閉,否則對伺服器會造成一定的負荷。
一般來說,一個使用者(對於ios來說也就是我們的專案中)只能有一個正在連線的socket,所以這個socket變數必須是全域性的,這裡可以考慮使用單例或是AppDelegate進行資料共享,本文使用單例。如果對一個已經連線的socket物件再次進行連線操作,會丟擲異常(不可對已經連線的socket進行連線)程式崩潰,所以在連線socket之前要對socket物件的連線狀態進行判斷
使用socket進行即時通訊還有一個必須的操作,即對伺服器傳送心跳包,每隔一段時間對伺服器傳送長連線指令(指令不唯一,由伺服器端指定,包括使用socket傳送訊息,傳送的資料和格式都是由伺服器指定),如果沒有收到伺服器的返回訊息,AsyncSocket會得到失去連線的訊息,我們可以在失去連線的回撥方法裡進行重新連線。
先建立一個單例,命名為Singleton
Singleton.h
// Singleton.h#import "AsyncSocket.h"#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \staticdispatch_once_t onceToken = 0; \
__strongstaticid sharedInstance = nil; \
dispatch_once(&onceToken, ^{ \
sharedInstance = block(); \
}); \
return sharedInstance; \
@interfaceSingleton : NSObject+ (Singleton *)sharedInstance;
@end
Singleton.m