服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS开发项目- 基于WebSocket的聊天通讯(1)

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

2021-02-14 23:32小兵快跑 IOS

这篇文章主要介绍了iOS开发项目- 基于WebSocket的聊天通讯,WebSocket是web通信方式的一种,有需要的可以了解一下。

公司项目需要开发一个类似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

?
1
2
3
4
5
6
7
platform :ios,'7.0'
 
target '白__socket--demo1' do
 
   pod 'socketrocket', '~> 0.5.1'
 
end

2.导入对象srwebsocket

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//连接成功
//代理方法实现
#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:@"您好 !"];
 
  }
}

实现效果:
iOS开发项目- 基于WebSocket的聊天通讯(1)

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

延伸 · 阅读

精彩推荐
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28