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

2025-05-29 0 84

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

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 iOS开发项目- 基于WebSocket的聊天通讯(1) https://www.kuaiidc.com/91950.html

相关文章

发表评论
暂无评论