C/S系统通信相关解决方案
27 June 2016
C/S系统通信相关解决方案
即时消息IM
-
目前主流的四种IM(IM:instant messaging,即时消息)协议:XMPP(Extensible Messageing and Presence Protocol:可扩展消息与表示协议)、即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。在这四种协议中,XMPP是最灵活的。XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。
- XMPP官网:https://xmpp.org
- 客户端:https://xmpp.org/software/clients.html
- 服务端:ejabberd、Openfire等
- SDK库:https://xmpp.org/software/libraries.html,OC库主要使用:xmppframework
- 第三方IM服务,百川IM、Leancloud等
Socket编程
- 套接字(socket)概念
- Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
- 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
- 多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。
- 建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
- 创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
- 于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket 连接断连,因此需要通过轮询告诉网络(所谓的心跳),该连接处于活跃状态。
- HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
-
Socket使用流程
-
使用开源的cocoaasyncsocket:https://github.com/robbiehanson/CocoaAsyncSocket
-
创建一个socket对象:
[[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
- 连接:
NSError *error = nil; [_socket connectToHost:host onPort:(uint16_t) port.intValue error:&error];
- 连接成功:
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
- 断开了连接:
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
- 发送数据:
[_socket writeData:data withTimeout:-1 tag:0]; - (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
- 读取数据:
[_socket readDataWithTimeout:-1 tag:0]; - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
-
iOS应用程序间共享数据
- 利用剪贴板(UIPasteboard);
剪贴板是应用程序之间传递数据的简单方式,建议不要使用全局的粘贴板,而是自己根据名字创建一个新的粘贴板,防止其它地方全局拷贝的影响。然后把需要共享的内容复制到粘贴板,粘贴板的内容可以是文本、URL、图片和UIColor等,另一个app就可以根据粘贴板的名字去读取相关的信息。
//Example1设置粘贴板的内容:
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:YES];
pasteboard.string = @"myShareData";
//Example2读取粘贴板的内容:
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:NO];
NSString *content = pasteboard.string;
- 使用自定义的URL Scheme;
- 通过共享开钥匙串。启Keychain Sharing,然后添加设置相同的Keychain Group,并添加Security.framework;
- 通过App Groups。开启app groups,需要添加一个group name,app之间通过这个group共享数据;
以上参考: