今天我們來聊一聊App通信芙沥!
1. 傳統(tǒng)的App與服務(wù)器之間啊的通信我們都很了解了诲祸,無非是第三方框架活著用蘋果原生的請求方式,還有socket而昨,還有各種千奇百怪的交互救氯,??,目前最出名的莫過于AFNetworking了歌憨,網(wǎng)上文章多的是着憨,我就不說了!
2. App與App之間的通信务嫡,如果是長鏈接的話我推薦使用CocoaAsyncSocket甲抖,這個好像是臉書的框架牛逼自然不多說,但是我研究了一下好像做不到與h5的通信心铃,因為這個協(xié)議不是用的ws協(xié)議准谚,因此客戶端只能接收到一個請求頭就沒響應(yīng)了。但是用在app之間的通信的話就綽綽有余了去扣。我們來大致的看一下柱衔,這個網(wǎng)上也是有文檔的。
2.1創(chuàng)建
GCDAsyncSocket *serviceScoket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
2.2綁定端口 和 指定訪問IP
NSError *error = nil;
? ? [serviceScoket acceptOnPort:8001 error:&error];
//下邊這個可以指定只允許本地訪問
//? ? ? ? [serviceScoket acceptOnInterface:@"localhost" port:8001 error:&error];
if (error == nil)
? ? {
? ? ? ? NSLog(@"開啟成功");
? ? }
? ? else
? ? {
? ? ? ? NSLog(@"開啟失敗 %@",error);
? ? }
2.3 然后實現(xiàn)代理在代理中有一步操作很重要 就是連接客戶端代理中的socket需要用一個數(shù)組保存下來愉棱,不然你一鏈接這個socket就斷開了唆铐。
#pragma mark GCDAsyncSocketDelegate
//連接到客戶端socket
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
? ? //sock 服務(wù)端的socket
? ? //newSocket 客戶端連接的socket
? ? NSLog(@"%@----%@",sock, newSocket);
? ? //保存連接的客戶端socket(否則newSocket釋放掉后鏈接會自動斷開)
? ? [self.clientSockets addObject:newSocket];
。羽氮。或链。。档押。。祈纯。令宿。。其他操作網(wǎng)上有只要實現(xiàn)兩個代理就能進(jìn)行通信了
}
app之間的通信就是這么個道理腕窥!是不是很簡單粒没,哈哈哈哈,就是一個app作為服務(wù)器端簇爆,一個作為客戶端癞松,當(dāng)然也可以做局域網(wǎng)之間的通信也是可以的爽撒!
3. App與Html之間的通信。
最新做一個項目就需要這個功能响蓉,把app作為服務(wù)端硕勿,h5作為展示端。因此我們需要在App端架設(shè)一個服務(wù)器枫甲,廢話不多說源武,我們引入最流行的CocoaHTTPServer框架。網(wǎng)上99%是講的如果實現(xiàn)如何網(wǎng)頁和手機傳文件想幻。今天我們來講一講網(wǎng)頁怎么給手機發(fā)Post請求和Get請求粱栖。
注意:Post請求部分我也是在網(wǎng)上找了很久找到的唯一一個講過這方面的,引用了一部分脏毯,作者是誰我忘了闹究。
3.1首先在app啟動的時候我們單獨創(chuàng)建一個文件夾用于服務(wù)器指定路徑∈车辏可直接在Documents里創(chuàng)建跋核,也可以在項目直接創(chuàng)建叛买,反正你必須這個文件夾的絕對路徑砂代。
3.2 搭建服務(wù)器
self.httpServer = [[HTTPServer alloc] init];
? ? [_httpServer setType:@"_http.tcp."];
//這一句是指定訪問路徑的地址文檔中有說明api是干嘛的
? ? //? ? [_httpServer setInterface:@"localhost"];
? ? [_httpServer setPort:8000];
//webLocalPath 是你創(chuàng)建的文件夾路徑
[_httpServer setDocumentRoot:webLocalPath];
//啟動服務(wù)器
if([_httpServer start:&error]){
? ? ? ? NSLog(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
? ? }
? ? else{
? ? ? ? NSLog(@"Error starting HTTP Server: %@", error);
? ? }
這樣我們的服務(wù)器就創(chuàng)建好了率挣,但是我們不知道h5什么時候在請求我們,而且也不能接參數(shù)椒功。繼續(xù):
CocoaHTTPServer有一個類是用來管理請求的捶箱,并且允許我們自定義,它就是HTTPConnection
httpServer文檔中說了
繼承這個類重寫我們的自己請求管理類
//擴展HTTPServer支持的請求類型丁屎,默認(rèn)支持GET,HEAD旱眯,不支持POST-?
-(BOOL)supportsMethod:(NSString *)method atPath:(NSString *)relativePath{
//parseParams是自帶的提取傳參數(shù)的方法晨川。這里解釋接收到請求
? [[NSNotificationCenter defaultCenter] postNotificationName:ReceiveRequestNotice object:self userInfo:[self parseParams:relativePath]];
?if ([@"POST" isEqualToString:method]) { return YES; }?
?return [super supportsMethod:method atPath:relativePath];}
//處量返回的response數(shù)據(jù)
- (NSObject *)httpResponseForMethod:(NSString *)method URI:(NSString *)path
{
//我們將要返回給h5的字符串删豺,這里是返回相應(yīng)的參數(shù)
? ? NSString *txt = @"test({wocao:\"1212122112321ss312\"})";
? ? NSData *data = [txt dataUsingEncoding:NSUTF8StringEncoding];
//HTTPDataResponse自帶的類
? ? return [[HTTPDataResponse alloc] initWithData:data];
}
最后服務(wù)器調(diào)用一下
[_httpServer setConnectionClass:[XKHTTPConnection class]];
基本上主體思路就完了。有問題可以留言呀页!
聲明:版權(quán)所有妈拌,轉(zhuǎn)載請注明出處!
聲明:版權(quán)所有蓬蝶,轉(zhuǎn)載請注明出處尘分!
聲明:版權(quán)所有猜惋,轉(zhuǎn)載請注明出處!