C/S系统相关解决方案

C/S系统相关解决方案

即时消息IM

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

以上参考:

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

IM开发-XMPP iOS开发

iOS应用程序间共享数据

关于iOS socket都在这里了

{{ message }}

{{ 'Comments are closed.' | trans }}