socket(掌握环信的前提,也是即时通讯的底层的实现)

1.Socket简介

  • Socket 又称为"套接字",,它与网络相关,学网络必学的一个知识
  • 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的每一端都称为一个socket
  • 应用程序通过"套接字"向网络发出请求或者答应网络请求
通信连接的方式

2.网络通信的要素

  • 网络上的请求就是通过Socket 来建立连接然后互相通信
  • IP地址(网络上主机设备的唯一标识)
  • 端号口(定位程序)
    <1>用于标示进程的逻辑地址,不同进程的表示
    <2>有效端口:0-65535,其中0-1024由系统使用或者保留端口,开发中建议只用1024以上端口
  • 传输协议 (用什么样的方式进行交互)
    <1>通讯的规则
    <2>常见的协议:TCP,UDP
    (1)TCP (传输控制协议)
    1.建立连接,形成传输数据的通道
    2.在连接中进行大数据传输(数据不受限制)
    3.通过3次握手完成连接:目的是可靠协议,安全送达
    4.必须建立连接效率会稍低
    (2)UDP (用户数据报协议)<不需要3次连接>
    1.将数据及源和目的封装成数据包中,不需要建立连接
    2.每个数据报的大小限制在64k之内
    3.因为无需连接,因此是不可靠协议
    4.不需要建立连接,速度快
    常见的协议:TCP,UDP

3.Socket通信流程图

Socket通信流程图
  • HTTP 底层是通过socket建立连接通信管道,实现数据传输
  • HTTP 是一个TCP的传输协议(方式),它是一个可靠,安全的协议

4.实现Socket服务端监听

  • 实现socket 的监听方法
    <1>使用C语言实现
    <2>使用CocoaAsyncSocket (OC) 第三方框架,内部都是对C的封装
    Telnet命令 : telnet host port/telnet 192.168.10.10 5228
    Telnet命令是连接服务器上的某个端口对应的服务
    <3>讲解一下Socket服务端对客户端请求的处理(以10086为形式来模拟)
    • 下面是oc命令行来写的
      1.在gitHub下载 CocoaAsyncSocket
      2.取出来里面的source->GCD
取出TCP协议

3.我们需要建立一个Socket对象

Socket对象

4.终端输入来连接服务端,然后敲Enter 来输入一些想要发送给服务器的内容,在JKServeLestening.m进行返回输入的内容,实现自问自答

   telnet 192.168.80.102 5228

5.重要的是掌握服务器端接受数据和返回数据的处理

   在终端输入 telnet 192.168.80.102 5228 后有个选择,3是退出服务器连接

6.具体的代码都在JKServeLestening类里面自己下载

5.群聊服务器端

  • 多个客户连接到服务器
  • 当一个客户端发送消息时,服务器转发给其他已经连接的客户端
  • 相当于一个群聊的意思
群聊服务端
  • 我们可以打开多个终端,来进行群聊操作
    在返回给用户信息时判断一下就好了

这里有两个比较重要的属性(端口号非常重要)

端口号:当一个手机有多个QQ的时候,为了区分外面的手机给他的两个QQ发送时,用端口号来区分的到底应该发给哪个QQ

/*
    //服务器IP地址
    @property (atomic, readonly, nullable) NSString *connectedHost;
    //端口号
    @property (atomic, readonly) uint16_t  connectedPort;
*/

服务器端的具体的代码

    /*
       服务器这边读取数据
   */

  -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
  {
     /*
           1.把 NSData 转化我 string
     */
      NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
     //把当前客户端的数据转发给其他客户端
      NSLog(@"接收到客户端的数据 = %@",string);

     for (GCDAsyncSocket *socket in self.clientSocketS) {
    
          if (socket != sock) {
             [socket writeData:data withTimeout:-1 tag:0];
        }
    }
      /*
           2.处理请求,返回数据给客户端
      */
    #warning 每次读取完数据后,都要调用一次监听数据的方法

    [sock readDataWithTimeout:-1 tag:0]; //(客户端有请求就调用下面的方法)
  }

6.群聊客户端(和上面的服务器是保持一致的)

  • 客户端也需要GCDAsyncSocket对象,挂代理GCDAsyncSocketDelegate
  • 里面与服务器连接成功需要监听,读取完数据还需要监听 (否则可能只有一次数据)
    [sock readDataWithTimeout:-1 tag:0];
    //1.连接到聊天服务器

    //1.1创建一个客户端的socket对象

    GCDAsyncSocket *clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];

    self.clientSocket = clientSocket;

    //1.2发送链接请求
    NSError *error = nil;

    [clientSocket connectToHost:@"192.168.80.102" onPort:5228 error:&error];

    /*
      读取数据
    */
    -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    {
       NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

       NSLog(@"%@",string);

        //读完数据也要监听

       [sock readDataWithTimeout:-1 tag:0];
    }
    /*
          与服务器连接成功
     */
    -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
     {
         NSLog(@"与服务器连接成功");

         //监听读取数据(只有如此才会读取下面方法中的数据)

          [sock readDataWithTimeout:-1 tag:0];
     }
    /*
          与服务器断开连接
     */

      -(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
    {
        NSLog(@"断开连接= %@",err);
    }

7.上面5和6的汇总

  • 一个客户端和一个服务器端,你需要把客户端里面的IP改为自己电脑的IP地址,端口 大于1024就好,自己随便设,但是服务器端和客户端要保持一致

下面是代码:在此只是模拟 群聊
服务器端群聊和客户端群聊代码

8.长连接和短连接

  • 长连接和短连接其实就是一个连接的保存状态,区别就是连接保存的时间

  • 讲解一下:Socket层上的协议(Http协议与XMPP协议都是定义数据传输格式)
    <1>Socket是层上的协议,指的是数据传输的格式
    <2>Http协议其实是它就是定义在网络上传输的数据格式,双方互相约束,也是数据传输的格式

  • XMPP协议,是一款即时通讯协议
    <1>可扩展消息处理现场的协议,是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测,这个协议可能最终允许因特网用户向因特网其他任何人发送即时消息

  • 具体的分析一下下面的协议

  • 以写一封信为标准:

** TCP/UDP (传输方式 ) ->EMS/申通/圆通**
HTTP/XMPP(数据传输格式) ->>新的内容格式 (中文或,英文)

9.简述即时通讯

  • 即时通讯,又称实时通讯
  • 即时通讯(Instant MessageIng,简称IM) 是一个实时通信系统,允许两人或者多人使用网络实时的传递文字消息,文件,语音与视频交流
  • 即时通讯在开发中使用的场景
    <1>开发一个类似于微信,QQ,易信的聊天软件
    <2>在电商APP集成买家和卖家的实时沟通等等
  • 当前时下,实现即时通讯的方案
    <1> XMPP(开源的即时通讯)
    <2> 环信
XMPP
  • XMPP协议是一个即时通讯的协议,在网络上传输的数据格式是XML,它是通过TCP/IP连接到服务器.
XMPP

综述:环信是在XMPP上的的二次开发

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容