java实现IM即时通讯聊天功能代码

编程实验

72人已加入

描述

即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能。不容置疑,Internet已经成为真正的信息高速公路。从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术,编程实现基于C/S架构的网络聊天工具是切实可行的。

目前,中国市场上的企业级即时通信工具主要包括:信鸽、视高科技的视高可视协同办公平台、263EM、群英CC2010、通软联合的GoCom、腾讯公司的RTX、IBM的Lotus Sametime、点击科技的GKE、中国互联网办公室的imo、中国移动的企业飞信、华夏易联的e-Link、擎旗的UcStar等。相对于个人即时通信工具而言,企业级即时通信工具更加强调安全性、实用性、稳定性和扩展性。

本文为大家介绍java Smack整合Openfire服务器实现IM即时通讯聊天功能代码。

详细程序

java Smack整合Openfire服务器实现IM即时通讯聊天功能代码如下:

[java] view plain copy print?

package com.hoo.smack;

import java.util.Collection;

import java.util.Iterator;

import javax.net.SocketFactory;

import org.jivesoftware.smack.AccountManager;

import org.jivesoftware.smack.Chat;

import org.jivesoftware.smack.ChatManager;

import org.jivesoftware.smack.Connection;

import org.jivesoftware.smack.ConnectionConfiguration;

import org.jivesoftware.smack.MessageListener;

import org.jivesoftware.smack.Roster;

import org.jivesoftware.smack.RosterEntry;

import org.jivesoftware.smack.XMPPConnection;

import org.jivesoftware.smack.XMPPException;

import org.jivesoftware.smack.packet.Message;

import org.jivesoftware.smack.packet.Presence;

import org.jivesoftware.smack.packet.Session;

import org.jivesoftware.smack.packet.Message.Type;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

/**

* 利用Smack框架完成 XMPP 协议通信

*/

public class SmackXMPPTest {

private Connection connection;

private ConnectionConfiguration config;

/** openfire服务器address */

private final static String server = “192.168.8.32”;

private final void fail(Object o) {

if (o != null) {

System.out.println(o);

}

}

private final void fail(Object o, Object.。。 args) {

if (o != null && args != null && args.length > 0) {

String s = o.toString();

for (int i = 0; i < args.length; i++) {

String item = args[i] == null ? “” : args[i].toString();

if (s.contains(“{” + i + “}”)) {

s = s.replace(“{” + i + “}”, item);

} else {

s += “ ” + item;

}

}

System.out.println(s);

}

}

/**

* 初始Smack对openfire服务器链接的基本配置

*/

@Before

public void init() {

try {

//connection = new XMPPConnection(server);

//connection.connect();

/** 5222是openfire服务器默认的通信端口,你可以登录http://192.168.8.32:9090/到管理员控制台查看客户端到服务器端口 */

config = new ConnectionConfiguration(server, 5222);

/** 是否启用压缩 */

config.setCompressionEnabled(true);

/** 是否启用安全验证 */

config.setSASLAuthenticationEnabled(true);

/** 是否启用调试 */

config.setDebuggerEnabled(false);

//config.setReconnectionAllowed(true);

//config.setRosterLoadedAtLogin(true);

/** 创建connection链接 */

connection = new XMPPConnection(config);

/** 建立连接 */

connection.connect();

} catch (XMPPException e) {

e.printStackTrace();

}

fail(connection);

fail(connection.getConnectionID());

}

@After

public void destory() {

if (connection != null) {

connection.disconnect();

connection = null;

}

}

/**

* ConnectionConfiguration 的基本配置相关信息

*/

@Test

public void testConfig() {

fail(“PKCS11Library: ” + config.getPKCS11Library());

fail(“ServiceName: {0}”, config.getServiceName());

// ssl证书密码

fail(“TruststorePassword: {0}”, config.getTruststorePassword());

fail(“TruststorePath: {0}”, config.getTruststorePath());

fail(“TruststoreType: {0}”, config.getTruststoreType());

SocketFactory socketFactory = config.getSocketFactory();

fail(“SocketFactory: {0}”, socketFactory);

/*try {

fail(“createSocket: {0}”, socketFactory.createSocket(“localhost”, 3333));

} catch (IOException e) {

e.printStackTrace();

}*/

}

/**

* Connection 基本方法信息

*/

@Test

public void testConnection() {

/** 用户管理 */

AccountManager accountManager = connection.getAccountManager();

for (String attr : accountManager.getAccountAttributes()) {

fail(“AccountAttribute: {0}”, attr);

}

fail(“AccountInstructions: {0}”, accountManager.getAccountInstructions());

/** 是否链接 */

fail(“isConnected:”, connection.isConnected());

fail(“isAnonymous:”, connection.isAnonymous());

/** 是否有权限 */

fail(“isAuthenticated:”, connection.isAuthenticated());

fail(“isSecureConnection:”, connection.isSecureConnection());

/** 是否使用压缩 */

fail(“isUsingCompression:”, connection.isUsingCompression());

}

/**

* 用户管理器

*/

@Test

public void testAccountManager() {

AccountManager accountManager = connection.getAccountManager();

for (String attr : accountManager.getAccountAttributes()) {

fail(“AccountAttribute: {0}”, attr);

}

fail(“AccountInstructions: {0}”, accountManager.getAccountInstructions());

fail(“supportsAccountCreation: {0}”, accountManager.supportsAccountCreation());

try {

/** 创建一个用户boy,密码为boy;你可以在管理员控制台页面http://192.168.8.32:9090/user-summary.jsp查看用户/组的相关信息,来查看是否成功创建用户 */

accountManager.createAccount(“boy”, “boy”);

/** 修改密码 */

accountManager.changePassword(“abc”);

} catch (XMPPException e) {

e.printStackTrace();

}

}

@Test

public void testUser() {

try {

/** 用户登陆,用户名、密码 */

connection.login(“hoojo”, “hoojo”);

} catch (XMPPException e) {

e.printStackTrace();

}

/** 获取当前登陆用户 */

fail(“User:”, connection.getUser());

/** 所有用户组 */

Roster roster = connection.getRoster();

/** 好友用户组,你可以用Spark添加用户好友,这样这里就可以查询到相关的数据 */

Collection rosterEntiry=“roster.getEntries();

Iterator iter=”rosterEntiry.iterator();

while (iter.hasNext()) {

RosterEntry entry = iter.next();

fail(“Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}”, entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);

}

fail(“-------------------------------”);

/** 未处理、验证好友,添加过的好友,没有得到对方同意 */

Collection unfiledEntries=“roster.getUnfiledEntries();

iter = unfiledEntries.iterator();

while (iter.hasNext()) {

RosterEntry entry = iter.next();

fail(“Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}”, entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);

}

}

@Test

@SuppressWarnings(“static-access”)

public void testPacket() {

try {

connection.login(“hoojo”, “hoojo”);

} catch (XMPPException e) {

e.printStackTrace();

}

//Packet packet = new Data(new DataPacketExtension(“jojo@” + server, 2, “this is a message”));

//connection.sendPacket(packet);

/** 更改用户状态,available=true表示在线,false表示离线,status状态签名;当你登陆后,在Spark客户端软件中就可以看到你登陆的状态 */

Presence presence = new Presence(Presence.Type.available);

presence.setStatus(“Q我吧”);

connection.sendPacket(presence);

Session session = new Session();

String sessid = session.nextID();

connection.sendPacket(session);

/** 向jojo@192.168.8.32 发送聊天消息,此时你需要用Spark软件登陆jojo这个用户,

* 这样代码就可以向jojo这个用户发送聊天消息,Spark登陆的jojo用户就可以接收到消息

**/

/** Type.chat 表示聊天,groupchat多人聊天,error错误,headline在线用户; */

Message message = new Message(“jojo@” + server, Type.chat);

//Message message = new Message(sessid, Type.chat);

message.setBody(“h!~ jojo, I‘am is hoojo!”);

connection.sendPacket(message);

try {

Thread.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

/**

* 测试聊天消息管理类

*/

@Test

public void testChatManager() {

/** 设置状态 */

try {

connection.login(“hoojo”, “hoojo”);

} catch (XMPPException e) {

e.printStackTrace();

}

/** 设置状态 */

Presence presence = new Presence(Presence.Type.available);

presence.setStatus(“Q我吧”);

connection.sendPacket(presence);

/** 获取当前登陆用户的聊天管理器 */

ChatManager chatManager = connection.getChatManager();

/** 为指定用户创建一个chat,MyMessageListeners用于监听对方发过来的消息 */

Chat chat = chatManager.createChat(“jojo@” + server, new MyMessageListeners());

try {

/** 发送消息 */

chat.sendMessage(“h!~ jojo……”);

/** 用message对象发送消息 */

Message message = new Message();

message.setBody(“message”);

message.setProperty(“color”, “red”);

chat.sendMessage(message);

} catch (XMPPException e) {

e.printStackTrace();

}

try {

Thread.sleep(1000 * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

/**

* 消息监听器,用户监听对方发送的消息,也可以想对方发送消息

*/

class MyMessageListeners implements MessageListener {

public void processMessage(Chat chat, Message message) {

try {

/** 发送消息 */

chat.sendMessage(“dingding……” + message.getBody());

} catch (XMPPException e) {

e.printStackTrace();

}

/** 接收消息 */

fail(“From: {0}, To: {1}, Type: {2}, Sub: {3}”, message.getFrom(), message.getTo(), message.getType(), message.toXML());

/*Collection bodys=”message.getBodies();

for (Body body : bodys) {

fail(“bodies[{0}]”, body.getMessage());

}

//fail(message.getLanguage());

//fail(message.getThread());

//fail(message.getXmlns());*/

fail(“body: ”, message.getBody());

}

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分