iOS开发项目- 基于WebSocket的聊天通讯(1)

公司项目需要开发一个类似QQ、微信的即时IM聊天功能,做到实时监控消息,需要用的技术是websocket。

概述WebSocket:

1.1 为什么我们需要WebSocket这样的实时的通信协议?

WebSocket是web通信方式的一种,像我们熟知的HTTP协议也是web通信方式的一种。但是我们知道HTTP协议是一种无状态的协议,其服务端本身不具备识别客户端的能力,必须借助外部的一些信息比如说session和cookie,才能与特定的客户端保持通信。也就是说我们所发送的每一个HTTP的请求都会带上请求头中一些相应的信息还有cookie,这明显会增加我们传输的信息的体量从而带来一定的网络延迟,对于一些对通信的实时性要求比较高的应用来说就是不可忍受的了,比如说聊天程序或者是运行在浏览器中的实时小游戏。最郁闷的却还是这些头信息和cookie往往对于服务器响应客户端的请求来说是多余的,也就是说虽然我每个请求都带了这些信息,但是服务器与客户端的交互过程中可能根本用不上这些信息。

为了改善HTTP请求的这种网络延迟的情况,也出现了一些适应不同需求的其他的[web通信]方式,比如说:轮询,长轮询(long-polling),数据流,EventSouce等等,WebSocket便是其中一种。

实际上大多数基于因特网(或者局域网)的网络链接通常都包含长连接和基于TCP套接字的双向消息交换。但是TCP协议是属于最底层的网络通信协议了,让一些不能信任的客户端脚本去访问底层的TCP套接字显然是不太安全的,因此WebSocket实现了一种较为安全的方案,它允许客户端脚本在客户端和支持WebSocket协议的服务器之间创建双向的套接字连接。从而使实时通信的某些网络操作变得简单。

1.2 WebSocket是如何工作的?

我们知道了WebSocket的主要作用是,允许服务器端与客户端进行全双工(full-duplex)的实时通信。这里有个例子特别好:HTTP协议像发电子邮件,发出后必须等待对方回信;WebSocket则是像打电话,服务器端和客户端可以同时向对方发送数据,它们之间存着一条持续打开的数据通道。

1.Pod导入SocketRocket

platform :ios,'7.0'

target '白__Socket--Demo1' do

   pod 'SocketRocket', '~> 0.5.1'

end

2.导入对象SRWebSocket

#import "ViewController.h"
#import "SRWebSocket.h"
@interface ViewController ()<SRWebSocketDelegate>
@property(nonatomic,strong) SRWebSocket *webSocket;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

}

//初始化
- (void)Reconnect{

  NSLog(@"1221---open");

  self.webSocket.delegate = nil;
  [self.webSocket close];

  self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://192.168.5.120:4141"]]];
  self.webSocket.delegate = self;
  self.title = @"Opening Connection...";

  [self.webSocket open];
}

- (void)viewWillAppear:(BOOL)animated{
  [self Reconnect];
}

- (void)viewDidDisappear:(BOOL)animated{
  // Close WebSocket
  self.webSocket.delegate = nil;
  [self.webSocket close];
  self.webSocket = nil;
 }

3.SRWebSocketDelegate

//连接成功
//代理方法实现
#pragma mark - SRWebSocketDelegate
- (void)webSocketDidOpen:(SRWebSocket *)webSocket{

  NSLog(@"Websocket Connected");
  self.title = @"Connected!";
 }
//连接失败
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{
  NSLog(@":( Websocket Failed With Error %@", error);

  self.title = @"Connection Failed! (see logs)";
  self.webSocket = nil;
 }
//接收到新消息的处理
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
//  NSString *str1 = self.replyContent.text;
//  NSString *str2 = [str1 stringByAppendingFormat:@"%@\n",message];
//  self.replyContent.text = str2;

  NSLog(@"%@--askl",message);

 }
//连接关闭
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{
  NSLog(@"Closed Reason:%@",reason);
  self.title = @"Connection Closed! (see logs)";
  self.webSocket = nil;
 }
//该函数是接收服务器发送的pong消息,其中最后一个是接受pong消息的,
在这里就要提一下心跳包,一般情况下建立长连接都会建立一个心跳包,
用于每隔一段时间通知一次服务端,客户端还是在线,这个心跳包其实就是一个ping消息,
我的理解就是建立一个定时器,每隔十秒或者十五秒向服务端发送一个ping消息,这个消息可是是空的
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload{

  NSString *reply = [[NSString alloc] initWithData:pongPayload encoding:NSUTF8StringEncoding];
  NSLog(@"%@",reply);
 }

#pragma mark - SendButton Response
- (IBAction)sendAction:(id)sender {
  [self.view endEditing:YES];
  // WebSocket
  if (self.webSocket) {

    [self.webSocket send:@"您好 !"];

  }
}

实现效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS 使用 socket 实现即时通信示例(非第三方库)

    其实写这个socket一开始我是拒绝的. 因为大家学C 语言和linux基础时肯定都有接触,客户端和服务端的通信也都了解过,加上现在很多开放的第三方库都不需要我们来操作底层的通信. 但是!还是想写.底层的东西最好了解下. 效果 由于5M的上传限制GIF可能看不清 我再截两张图吧 服务器 客户端A 客户端B 模型图 分析 由上图可以了解到服务器和客户端需要做哪些工作 服务器 抽象一点分为: 1.创建线程等待接收客户端的连接 2.接收并解析客户端发来的消息 3.给客户端发送消息 具体一点: 1.创建

  • IOS开发网络篇—Socket编程详解

    一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议对应于应用层 tcp协议对应于传输层 ip协议对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络中传输:而HTTP是应用

  • IOS 详解socket编程[oc]粘包、半包处理

    IOS 详解socket编程[oc]粘包.半包处理 在做socket编程时,如果是做tcp连接,那就不可避免的会遇到粘包与半包的问题,粘包就是多组数据被一并接收了,粘在了一起,无法做划分:半包就是有数据接收不完整,无法处理.要解决粘包.半包的问题,一般在设计数据(消息)格式时会约定好一个字段专门用于描述数据包的长度,这样就使数据有了边界,依靠这个边界,就能把每组数据划分出来,数据不完整时也能获知数据的缺失. (当然也可以把数据设计成定长数据,但这样不够灵活:或者用\n,\r这类字符作为数据划分依

  • iOS开发项目- 基于WebSocket的聊天通讯(2)

    公司项目需要开发一个类似QQ.微信的即时IM聊天功能,做到实时监控消息,需要用的技术是websocket,今天整理下语言聊天这块:其实语言聊天,包含两部分,录音和音乐播放,关于简单语言聊天功能如下图: 录音 在AVFoundation框架中有一个AVAudioRecorder类专门处理录音操作,它同样支持多种音频格式.与AVAudioPlayer类似,你完全可以将它看成是一个录音机控制类,下面是常用的属性和方法: 先来了解下AVAudioRecorder的常用属性: @property (rea

  • iOS应用中使用AsyncSocket库处理Socket通信的用法讲解

    用socket可以实现像QQ那样发送即时消息的功能.客户端和服务端需要建立长连接,在长连接的情况下,发送消息.客户端可以发送心跳包来检测长连接. 在iOS开发中使用socket,一般都是用第三方库AsyncSocket,不得不承认这个库确实很强大.下载地址CocoaAsyncSocket . 特性 AsyncSocket类是支持TCP的. AsyncUdpSocket是支持UDP的. AsyncSocket是封装了CFSocket和CFSteam的TCP/IP socket网络库.它提供了异步操

  • iOS App之间的通信 local socket

    之前看到一篇文章介绍到App之间的五种通信方式,它分别有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket进行本地通信.前面4种都有用到过,也相对比较简单,几行代码的事.对于最后一种之前一直没用到过(原谅我还是个小白),所以今天试着写了下,这儿记录在这里和大家分享. 好了,废话不多说,开始: 首先,说下它的原理,其实很简单,一个App在本地的端口进行TCP的bind和listen,另外一个App在

  • IOS中使用 CocoaAsyncSocket​

    Socket 如今在 iOS 里对 Socket 的应用慢慢多了起来,就一个即时通讯,很多应用都有集成,那即时通讯功能一般来说就肯定是基于 Socket 的,Socket 这个话题我一直谈论的比较少,一是由于看过一些 C/C++ 操作 Socket 的代码被吓到了一直还有心理阴影存在,二是工作里没怎么遇到相关的需求应用,所以也没有去深入研究相关内容. 还没接触过 Socket 编程肯定也会听说过这几个关键字:包.握手.连接.TCP.UDP 等等,Socket 编程的文章网上大把大把有,而作为一个

  • iOS App通信之local socket示例

    之前看到一篇文章介绍到App之间的五种通信方式,它分别有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket进行本地通信.前面4种都有用到过,也相对比较简单,几行代码的事.对于最后一种之前一直没用到过(原谅我还是个小白),所以今天试着写了下,这儿记录在这里和大家分享. 好了,废话不多说,开始: 首先,说下它的原理,其实很简单,一个App在本地的端口进行TCP的bind和listen,另外一个App在

  • iOS开发项目- 基于WebSocket的聊天通讯(1)

    公司项目需要开发一个类似QQ.微信的即时IM聊天功能,做到实时监控消息,需要用的技术是websocket. 概述WebSocket: 1.1 为什么我们需要WebSocket这样的实时的通信协议? WebSocket是web通信方式的一种,像我们熟知的HTTP协议也是web通信方式的一种.但是我们知道HTTP协议是一种无状态的协议,其服务端本身不具备识别客户端的能力,必须借助外部的一些信息比如说session和cookie,才能与特定的客户端保持通信.也就是说我们所发送的每一个HTTP的请求都会

  • PHP框架实现WebSocket在线聊天通讯系统

    ThinkPHP使用Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展 tp5的项目根目录下执行composer命令安装think-swoole: composer require topthink/think-swoole 话不多说,直接上代码: 新建WebSocket.php控制器: (监听端口要确认服务器放行,宝塔环境还需要添加安全组规则) <?php namespace app\home\controller; use t

  • Android Flutter基于WebSocket实现即时通讯功能

    目录 前言 联系人界面构建 聊天界面的实现 消息界面的 MultiProvider 运行效果 前言 我们在前面花了很大篇幅介绍 Provider 状态管理,这是因为在 Flutter 中,Provider 是众多状态管理插件的首选.本篇以即时聊天为例,来讲述 Provider 的综合应用,也算是 Provider 状态管理系列的终结篇.本篇涉及的内容如下: 联系人界面的构建: 聊天界面的简单实现; StreamProvider 接收 Socket流数据并自动通知界面刷新; MultiProvid

  • php+html5基于websocket实现聊天室的方法

    本文实例讲述了php+html5基于websocket实现聊天室的方法.分享给大家供大家参考.具体如下: html5的websocket 实现了双向通信,折腾了几天弄了个聊天室,分享给大家 <?php error_reporting(E_ALL); ob_implicit_flush(); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $sockets; public $users; public $master;

  • C#基于WebSocket实现聊天室功能

    本文实例为大家分享了C#基于WebSocket实现聊天室功能的具体代码,供大家参考,具体内容如下 前面两篇温习了,C# Socket内容 本章根据Socket异步聊天室修改成WebSocket聊天室 WebSocket特别的地方是 握手和消息内容的编码.解码(添加了ServerHelper协助处理) ServerHelper: using System; using System.Collections; using System.Text; using System.Security.Cryp

  • vue基于websocket实现智能聊天及吸附动画效果

    目录 前言: 1.效果如下: 2.主要功能: 2.1.基于websocket实现聊天功能,封装了一个socket.js文件 2.2使用Jwchat插件实现类似QQ.微信电脑端的功能 2.3动画效果(如关闭打开时动画.吸附效果及其他效果) 3.实现步骤: 3.1.实现websocket聊天功能 3.2.在页面中的使用方法: 关闭连接 发送给后端的方法 4.使用Jwchat插件实现类似QQ.微信电脑端的功能 4.1步骤 5.动画效果 前言: 发现这篇文章写的有点多,我总结一下整体思路: 首先这个功能

  • 使用WebSocket实现即时通讯(一个群聊的聊天室)

    随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据. 传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据:这种客户端是主动方,服务端是被动方的传统Web模式对于信息变化不频繁的Web应用来说造成的麻烦

  • ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解

    本文实例讲述了ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例.分享给大家供大家参考,具体如下: ThinkPHP使用Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展(相关文章:Linux下源码包安装使用Swoole扩展) 在tp5的项目根目录下执行composer命令安装think-swoole: composer require topthink/think-swoole 安装成功: 话不多说

  • 基于django channel实现websocket的聊天室的方法示例

    websocket 网易聊天室? ​ web微信? ​ 直播? 假如你工作以后,你的老板让你来开发一个内部的微信程序,你需要怎么办?我们先来分析一下里面的技术难点 消息的实时性? 实现群聊 现在有这样一个需求,老板给到你了,关乎你是否能转正?你要怎么做? 我们先说消息的实时性,按照我们目前的想法是我需要用http协议来做,那么http协议怎么来做那? 是不是要一直去访问我们的服务器,问服务器有没有人给我发消息,有没有人给我发消息?那么大家认为我多长时间去访问一次服务比较合适那? 1分钟1次?1分

随机推荐