XMPP 简单即时通讯

搭建服务器和数据库

搭建服务器我用的是 Openfire,数据库用的是 MySQL。

这里推荐两篇文章。

配置 MySQL,用的是 MySQL Workbench

http://justsee.iteye.com/blog/1753467

配置服务器 Openfire

http://www.cnblogs.com/xiaodao/archive/2013/04/05/3000554.html

先配置好数据库,然后配置服务器。
然后两个都打开。

xmpp-1

数据库也打开。

xmpp-2

下一个 XMPP 客户端,就是用来测试的。
我下的是 Adium。

Adium

这里下

配置

然后在 Adium 里面添加账号,服务器要用 Openfire 设置好的 127.0.0.1,端口用 5222。

这里 Openfire 里面的服务器端口,5222 是客户端连接服务器。

server

登录成功后可以在 Openfire 里面看到用户已经在线。

online

然后另一个客户端,我直接用代码,觉得麻烦没做界面。

简单实现。
设置 XMPPStream。

1
2
3
4
5
6
7
8
- (XMPPStream *)stream
{
if (!_stream) {
_stream = [[XMPPStream alloc] init];
[_stream addDelegate:self delegateQueue:dispatch_get_current_queue()];
}
return _stream;
}

然后设置账号,只是测试,所以直接在 viewDidLoad 里面写了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)viewDidLoad {
[super viewDidLoad];

[self.stream setMyJID:[XMPPJID jidWithString:@"[email protected]"]];
[self.stream setHostName:@"127.0.0.1"];
[self.stream setHostPort:5222];

NSError *error = nil;
[self.stream connectWithTimeout:1.0f error:&error];

if (error) {
NSLog(@"connectWithTimeout : %@",error);
}
}

然后就是验证密码,下面的方法是上线,这些是代理方法,记得设置 XMPPStream 的代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)xmppStreamDidConnect:(XMPPStream *)sender
{
NSError *error = nil;
[self.stream authenticateWithPassword:@"test123" error:&error];
if (error) {
NSLog(@"authenticateWithPassword : %@",error);
}
}


- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
XMPPPresence *presence = [XMPPPresence presence];
[self.stream sendElement:presence];
}

这是接收信息的方法,我没做界面,直接打印出来接收的信息。

1
2
3
4
5
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
NSString *msg = [[message elementsForName:@"body"] lastObject];
NSLog(@"%@",msg);
}

如果验证失败的话,会调用这个方法。

1
2
3
4
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
NSLog(@"didNotAuthenticate : %@",error);
}

后来在 Openfire 查看,用户名必须带服务器名。

serverlist

例如我的账号是 test123,设置 JID 的用户名就是 [email protected]

1
[self.stream setMyJID:[XMPPJID jidWithString:@"[email protected]"]];

然后运行,没有报错,在 Openfire 显示已经在线。

online2

然后就可以开始聊天了,下面的是刚发的,上面的是之前的聊天记录。

发了文字和一个链接。

chat

然后 Xcode 输出。

即时通讯最简单的就这样,退出 APP 后 Openfire 后台就会显示下线。