请稍侯

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
    • 服务端:ejabberdOpenfire
    • SDK库:https://xmpp.org/software/libraries.html,OC库主要使用:xmppframework
  • 客户端的开发使用:http://www.jianshu.com/p/eb273cb8ac94

  • 第三方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使用流程

      [[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共享数据;

以上参考:

iOS中XMPP简单聊天实现 注册和登录

IM开发-XMPP iOS开发

iOS应用程序间共享数据

关于iOS socket都在这里了