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

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: socket(掌握环信的前提,也是即时通讯的底层的实现)

1.Socket简介


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


image.png


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.不需要建立连接,速度快


image.png

3.Socket通信流程图


image.png


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


4.实现Socket服务端监听


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


  • 下面是oc命令行来写的
    1.在gitHub下载 CocoaAsyncSocket
    2.取出来里面的source->GCD


image.png


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


image.png

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

telnet 192.168.80.102 5228

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

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

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


5.群聊服务器端


  • 多个客户连接到服务器
  • 当一个客户端发送消息时,服务器转发给其他已经连接的客户端
  • 相当于一个群聊的意思


image.png

  • 我们可以打开多个终端,来进行群聊操作
    在返回给用户信息时判断一下就好了

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


端口号:当一个手机有多个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> 环信


image.png

  • XMPP协议是一个即时通讯的协议,在网络上传输的数据格式是XML,它是通过TCP/IP连接到服务器.



image.png


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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
4月前
|
资源调度 前端开发
vue3.2最新语法如何使用socket.io实现即时通讯
vue3.2最新语法如何使用socket.io实现即时通讯
|
7月前
|
数据可视化 Java 关系型数据库
基于java Swing 框架使用socket技术开发的即时通讯系统【源码+数据库】
基于java Swing 框架使用socket技术开发的即时通讯系统【源码+数据库】
|
JavaScript
socket.io实现即时通讯
socket.io实现即时通讯
90 0
|
Ubuntu TensorFlow 算法框架/工具
基于 socket 的即时通讯文件传输聊天软件
基于 socket 的即时通讯文件传输聊天软件
152 0
基于 socket 的即时通讯文件传输聊天软件
|
存储 移动开发 JavaScript
【你的第一个socket应用】Vue3+Node实现一个WebSocket即时通讯聊天室
这篇文章主要是用WebSocket技术实现一个即时通讯聊天室。从0到1一步一步的编写所有代码,上手容易
654 0
【你的第一个socket应用】Vue3+Node实现一个WebSocket即时通讯聊天室
|
PHP
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
426 0
dzq
|
移动开发 资源调度 小程序
微信小程序的socket.io即时通讯开发(基于E聊SDK)
1. 微信小程序支持https, wss 两种连接方式, E聊SDK能适配小程序平台; 2. E聊SDK 在设计之初已具有良好的跨平台支持。
dzq
1034 0
|
2月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
|
5月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
57 4
|
5月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
34 3
下一篇
无影云桌面