- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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 。
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)的文章就讲到这里了,如果你想了解更多关于iOS开发项目- 基于WebSocket的聊天通讯(1)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
有没有办法只允许 https 而不是 http 与 Neo4j 服务器通信?另外,Neo4j Shell 的通信使用哪个 channel ,http 还是 https? 最佳答案 这来自 Neo4j
您好,我有新问题 :) 我正在构建带有面板的简单时事通讯,以向注册用户和时事通讯邮件地址发送邮件。 我有此代码,但时事通讯仅发送给注册用户。谁能告诉我为什么? $zapytanie = mys
第一次发帖,所以可能会有比必要的更多的信息,但我想彻底: 我们的 C 练习之一是创建发送器和接收器程序,通过 RS232 串行通信与零调制解调器交换数据。我们使用了虚拟端口程序(如果你想测试的话,我使
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有一台通过 RS485 连接到另一台设备的单板计算机。计算机应向设备发送请求并接收响应(使用设备相关协议(protocol))。我可以毫无问题地发送消息并且设备接收它们(例如,我可以更改设备的参数)
我目前正在尝试在我的 Visual Basic 6 应用程序中引用 .NET COM 库。我已经使用 Regasm 注册了它,并且在我的类(class)中将 ComVisible 设置为 true。但
Closed. This question needs to be more focused 。它目前不接受答案。 想改善这个问题吗?更新问题,使其仅通过 editing this post 关注一个
我尝试通过 https 协议(protocol)在 Archiva 和 Jenkins 之间建立通信,但我收到以下错误: [WARNING] Could not transfer metadata .
我完成了一个运行良好的客户端/服务器套接字通信程序。现在我想弄清楚如何做到这一点,以便我可以同时拥有到服务器的多个客户端连接。我环顾四周,似乎有不止几种不同的方法可以做到这一点。所以我来这里是想向你们
我正在 mailchimp 中制作时事通讯,我在使用 outlook 时遇到了这个问题,它一直在干扰我的两个专栏,如图所示: 这是这部分的代码:
我正在创建一份时事通讯,经过大量努力,它在除 android 的 gmail 应用程序之外的任何地方都有效。问题是它似乎有最小字体大小,这会导致我的表格损坏。 有没有办法克服最小字体大小而不是媒体查询
C++ 作为Client端 view plaincopy to clipboardprint? 复制代码 代码如下: // Client.cpp : Defines the entry poi
我创建了 ECM NewsLetter,其中包含一些网站链接(另一个项目)。在在线版本的 NewsLetter 链接中工作正常,但是当我将此 NewsLetter 发送到我的电子邮件并尝试单击我的邮件
无论出于何种原因,我的文本大小调整在 iPhone 上无法正常工作,但在 Android 和其他电子邮件格式中工作正常。似乎看不出这两个文件之间有任何区别。图片也调整了大小,似乎只是文本的问题。
我正在开发一个网站,我需要将 HTML 新闻稿发送到邮件列表。 我构建了一个 html 框架,其中包含“在浏览器中查看”和“取消订阅”链接(原因会有所不同)。在管理模块中,我发布 html 并为 ht
我正在尝试在 B-L072Z-LRWAN(Master) 和 Arduino(Slave) 之间进行 I2C 通信。 我使用以下代码成功将数据从主站发送到从站: B-L072Z-LRWAN 代码: #
我有 ECM NewsLetter,其中包含指向站点(另一个项目)的一些链接。当我通过单击发送按钮将此时事通讯发送到我的电子邮件时 - 当我从电子邮件收件箱中单击它们时,链接不起作用。它显示 404
我是一名优秀的程序员,十分优秀!