XMPPService

package com.gci.common;

 

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

 

import org.jivesoftware.smack.Chat;

import org.jivesoftware.smack.ChatManager;

import org.jivesoftware.smack.ChatManagerListener;

 

import org.jivesoftware.smack.Connection;

import org.jivesoftware.smack.ConnectionConfiguration;

 

import org.jivesoftware.smack.MessageListener;//消息监听器

 

import org.jivesoftware.smack.PacketCollector;

import org.jivesoftware.smack.PacketListener;

 

import org.jivesoftware.smack.Roster;

import org.jivesoftware.smack.RosterEntry;

import org.jivesoftware.smack.RosterGroup;

import org.jivesoftware.smack.RosterListener;// 好友监听器

 

import org.jivesoftware.smack.XMPPConnection;

import org.jivesoftware.smack.XMPPException;

 

import org.jivesoftware.smack.filter.PacketFilter;

import org.jivesoftware.smack.filter.PacketIDFilter;

 

import org.jivesoftware.smack.packet.Message;

import org.jivesoftware.smack.packet.Packet;

import org.jivesoftware.smack.packet.Presence;

import org.jivesoftware.smack.packet.Presence.Mode;

 

import com.gci.common.GlobalResource;

import com.gci.common.ManagerProtocol;

import com.gci.service.terminalgroupImpl.TerminalMessageManagerImpl;

 

 

public class XMPPService{

 

private static XMPPService xmpp = new XMPPService();

private Connection connection = null;

-------------

private XMPPService() {

};

-------------

public static XMPPService getInstance() {

return xmpp;

}

--------------

//是否在运行通过connection来判断

public boolean working() {

if (connection == null) {

return false;

}

return true;

}

---------------

public void XMPPReset(){

//TerminalMessageManager.getInstance().addSysLog("xmpp","reset",GlobalResource.getInstance().INFO);

System.out.println("xmpp server reset\n");

disconnect();//断开XMPP连接,connection.disconnect();

XMPPInit();

}

------------------

// XMPP初始化

public void XMPPInit() {

    System.out.println("XMPPInit\n");

if (connection != null) {

//TerminalMessageManager.getInstance().addSysLog("xmpp","connection no init again ",GlobalResource.getInstance().INFO);

//System.out.println("xmpp server is running\n");

return;

}

 

//TerminalMessageManager.getInstance().addSysLog("xmpp","init",GlobalResource.getInstance().INFO);

 

ConnectionConfiguration config;

config = new ConnectionConfiguration(GlobalResource.getInstance().xmppAddr, GlobalResource.getInstance().xmppPort);

/**  @Value("${xmppAddr}")

public  String xmppAddr = "127.0.0.1";

@Value("${xmppName}")

public  String xmppName = "admin";

public  int xmppPort = 5222;

public  String xmppPS = "jiesai";

public  boolean autofound = true;

@Value("${redisAddr}")

public  String redisAddr = "127.0.0.1";

@Value("${updatePath}")

public  String updatePath = "";

*/

config.setReconnectionAllowed(true);

connection = new XMPPConnection(config);

try {

connection.connect();

connection.login(GlobalResource.getInstance().xmppName, GlobalResource.getInstance().xmppPS);

connection.getRoster().setSubscriptionMode(

Roster.SubscriptionMode.accept_all);

System.out.println("xmpp connecting ok\n");

//TerminalMessageManager.getInstance().addSysLog("xmpp","init success",GlobalResource.getInstance().INFO);

// 待更改

//addRosterListener(null);

// 添加消息监听器

//setChatListener(null);

catch (XMPPException e) {

// e.printStackTrace();

String msg = e.toString();

if (msg.contains("XMPPError connecting")) {

System.out.println("XMPPError connecting");

connection.disconnect();

connection = null;

//TerminalMessageManager.getInstance().addSysLog("xmpp","init faile",GlobalResource.getInstance().FATAL);

}

}

}

-------------------

// 消息监听器

public void addRosterListener(RosterListener listener) {

// 好友监听器

if (connection==null){

//TerminalMessageManager.getInstance().addSysLog("xmpp","addRosterListener error",GlobalResource.getInstance().ERROR);

return;

}

connection.getRoster().addRosterListener(listener);

}

--------------

// 消息监听器

public void setChatListener(final MessageListener listener) {

if (connection==null){

//TerminalMessageManager.getInstance().addSysLog("xmpp","setChatListener error",GlobalResource.getInstance().ERROR);

return;

}

ChatManager manager = connection.getChatManager();

manager.addChatListener( new ChatManagerListener() {

public void chatCreated(Chat chat, boolean arg1) {

chat.addMessageListener(listener);

}

});

}

---------------------

// 获取所有用户状态

public List<HashMap<String, String>> getAllFriendsWithState() {

List<HashMap<String, String>> statuslist = new ArrayList<HashMap<String, String>>();

List<RosterEntry> userlist = getAllFriends();

for (int i = 0; i < userlist.size(); i++) {

HashMap<String, String> amap = new HashMap<String, String>();

String nickname = userlist.get(i).getName();

String groups = userlist.get(i).getGroups().iterator().next().getName();

//System.out.println(nickname);

/*

try {

nickname = new String(nickname.getBytes("UTF-8"),"UTF-8");

groups = new String(groups.getBytes("UTF-8"),"UTF-8");

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}*/

amap.put("nickName", nickname);

amap.put("userName", userlist.get(i).getUser());

amap.put("groups", groups);

//System.out.println(amap.get("groups"));

String state = new String();

state = state + connection.getRoster().getPresence(userlist.get(i).getUser());

amap.put("state", state);

statuslist.add(amap);

}

return statuslist;

}

------------

public boolean deleteTerminal(String username)

{

boolean b = false;

try {

connection.getRoster().removeEntry(connection.getRoster().getEntry(username));

b = true;

catch (XMPPException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return  b;

}

--------------

//判断一个用户是否存在

public boolean isUser(String username)

{

boolean b = connection.getRoster().contains(username);

return b;

}

---------------

//判断一个用户是否存在

public boolean isGroupAssist(String group)

{

boolean b = false;

try

{

b = connection.getRoster().getGroups().contains(connection.getRoster().getGroup(group));

}catch(Exception e)

{

b = false;

}

return b;

}

// 获取所有用户状态,返回值:用户名:昵称:状态 

public List<String> getAllFriendsStatus() {

List<String> statuslist = new ArrayList<String>();

List<RosterEntry> userlist = getAllFriends();

for (int i = 0; i < userlist.size(); i++) {

statuslist.add(userlist.get(i).getName()

":"

connection.getRoster().getPresence(

userlist.get(i).getUser()));

}

return statuslist;

}

-----------------

//通过用户名获取昵称

public String getNicknameByUsername(String username)

{

return connection.getRoster().getEntry(username).getName();

}

 

//通过用户名获取用户状态

public String getFriendStatus(String userName) {

 

return connection.getRoster().getPresence(userName).toString();

}

------------------

// 获取所有用户列表

public List<RosterEntry> getAllFriends() {

List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();

Collection<RosterEntry> rosterEntry = connection.getRoster().getEntries();

Iterator<RosterEntry> i = rosterEntry.iterator();

while (i.hasNext()) {

EntriesList.add(i.next());

}

return EntriesList;

}

------------------------

// 获取某个分组下的所有用户列表

public List<RosterEntry> getAllFriendsByGroup(String groupName) {

List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();

RosterGroup rosterGroup = connection.getRoster().getGroup(groupName);

Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();

Iterator<RosterEntry> i = rosterEntry.iterator();

while (i.hasNext())

EntriesList.add(i.next());

return EntriesList;

}

 

//获取某个分组下的所有在线用户

public List<RosterEntry> getOnlineListByGroup(String groupName) {

List<RosterEntry> onlinelist = new ArrayList<RosterEntry>();

List<RosterEntry> userList = getAllFriendsByGroup(groupName);

for (int i = 0; i < userList.size(); i++) {

if (!connection.getRoster().getPresence(userList.get(i).getUser())

.toString().contains("unavailable"))

onlinelist.add(userList.get(i));

}

return onlinelist;

}

 

//获取某个分组下的所有离线用户

public List<RosterEntry> getOfflineListByGroup(String groupName)

{

List<RosterEntry> offlinelist = new ArrayList<RosterEntry>();

List<RosterEntry> userList = getAllFriendsByGroup(groupName);

for (int i = 0; i < userList.size(); i++)

{

if (connection.getRoster().getPresence(userList.get(i).getUser())

.toString().contains("unavailable"))

offlinelist.add(userList.get(i));

}

return offlinelist;

}

// 获取某个分组下的所有在线用户名

public List<String> getUsernameByGroup(String groupName) {

List<String> onlinelist = new ArrayList<String>();

List<RosterEntry> userList = getAllFriendsByGroup(groupName);

for (int i = 0; i < userList.size(); i++) {

if (!connection.getRoster().getPresence(userList.get(i).getUser())

.toString().contains("unavailable"))

onlinelist.add(userList.get(i).getUser());

}

return onlinelist;

}

 

/**

 * 获取所有分组列表

 */

public List<RosterGroup> getAllGroups() {

List<RosterGroup> groupsList = new ArrayList<RosterGroup>();

Collection<RosterGroup> rosterGroup = connection.getRoster()

.getGroups();

Iterator<RosterGroup> i = rosterGroup.iterator();

while (i.hasNext())

groupsList.add(i.next());

return groupsList;

}

 

/**

 * 断开XMPP连接

 */

public void disconnect() {

connection.disconnect();

connection = null;

}

 

/**

 * 添加组

 */

public boolean addGroup(String groupName) {

try {

connection.getRoster().createGroup(groupName);

return true;

catch (Exception e) {

e.printStackTrace();

return false;

}

}

 

/**

 * 删除组

 */

public static boolean removeGroup(Roster roster, String groupName) {

return false;

}

/**

 * 获取openfire服务域名

 */

public String getServiceName() {

return connection.getServiceName();

}

public String getUser() {

return connection.getUser();

}

 

/**

 * 添加好友

 */

public static boolean addUser(Roster roster, String userName, String name) {

try {

roster.createEntry(userName, name, null);

return true;

catch (Exception e) {

e.printStackTrace();

//TerminalMessageManager.getInstance().addSysLog("xmpp","add user error",GlobalResource.getInstance().ERROR);

return false;

}

}

 

/**

 * 添加好友

 * 

 * @param roster

 * @param userName

 * @param name

 * @return

 */

public static boolean addUser(Roster roster, String userName, String name,

String groupName) {

try {

roster.createEntry(userName, name, new String[] { groupName });

return true;

catch (Exception e) {

e.printStackTrace();

//TerminalMessageManager.getInstance().addSysLog("xmpp","add user with group error",GlobalResource.getInstance().ERROR);

return false;

}

}


//发送消息并记录日志,content 是一个完整的协议,参考终端管理系统协议

public String sendMessageSyncT(String userName, String msg) {

    Message message = new Message();

String content = msg;

System.out.println("--------------"+content+"-------------");

message.setBody(content);

message.setTo(userName);

 

PacketFilter filter = new PacketIDFilter(message.getPacketID());

PacketCollector myCollector = connection.createPacketCollector(filter);

//TerminalMessageManager.getInstance().addSysLog("xmpp","sendMessageSync:content:\t"+content,GlobalResource.getInstance().DEBUG);

 

// Send create & join packet.

         connection.sendPacket(message);

        // 接着, 我们创建一个 packet listener. 方便起见我们使用匿名内部类.

        PacketListener myListener = new PacketListener() {

            public void processPacket(Packet packet) {

                  // 当包到的时候你做什么.

                  if(packet instanceof Message) {  

                    System.out.println("From: " + packet.getFrom() + "\n");     

                    System.out.println("Body: " + ((Message)packet).getBody());   

                  }

                            //myCollector.cancel();     

             }

        };

        // 注册.

        connection.addPacketListener(myListener, filter);

return "sucess";

        

}

-------------------------

//发送消息并记录日志,content 是一个完整的协议,参考终端管理系统协议

public String sendMessageSync(String userName, String msg) {

Message message = new Message();

String content = msg;

System.out.println("--------------"+content+"-------------");

message.setBody(content);

message.setTo(userName);

PacketFilter filter = new PacketIDFilter(message.getPacketID());

PacketCollector myCollector = connection.createPacketCollector(filter);

//TerminalMessageManager.getInstance().addSysLog("xmpp","sendMessageSync:content:\t"+content,GlobalResource.getInstance().DEBUG);

 

// Send create & join packet.

                connection.sendPacket(message);

              

                // Wait up to a certain number of seconds for a reply.

                int time = 0;

                String result = "";

                String body = "";

                //如果结果是success,或者error,timeout,都会退出

Packet packet = myCollector.nextResult(5000);

myCollector.cancel();

                System.out.println("From: " + packet.getFrom() + "\n");     

                // when receiving prc's Message, just say something else again     

// Interprete the result and answer the privacy only if it is valid

if (packet == null{

result = "time_out";

}else if (packet.getError() != null) {

    result = "pack_error";

}else{

    

    if(packet instanceof Message) {  

Message msg1 = (Message)packet;

                System.out.println("From: " + msg1.getFrom() + "\n");     

                        System.out.println("Body: " + msg1.getBody());   

                        result = msg1.getBody();

                    }

}

                return result;

}

--------------------------

//发送消息,立刻返回,并记录日志,content是完成的管理协议,包含msg id 方便日后检索结果

public String sendMessageAsync(String userName, String msg)  {

Message message = new Message();

String content = msg;

System.out.println("--------------"+content+"-------------");

message.setBody(content);

message.setTo(userName);

connection.sendPacket(message);

System.out.println(userName);

try {

// 分析content内容,归类

//TerminalManager.getDataSevice().addMgrTermLog(message.getPacketID(), proto.type(),  userName, content ,"Async");

catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

/*

MysqlService log = new MysqlService();

userName = userName.substring(0, userName.indexOf("@"));

try {

log.savelog(userName, content);

log.close();

} catch (Exception e) {

e.printStackTrace();

}*/

 

return message.getPacketID();

}

--------------------

//修改组名

    public void renameGroup(String groupName,String newName)

    {

    connection.getRoster().getGroup(groupName).setName(newName);

}

--------------------

    //通过用户名查找该用户所在的组

    public String getGroupByUsername(String username)

    {

    return connection.getRoster().getEntry(username).getGroups().iterator().next().getName();

}

--------------------

    //修改终端昵称和分组

    public void editTerminal(String userName,String nickName,String group)

    {

    try 

    {

connection.getRoster().createEntry(userName, nickName, new String[]{group});

catch (XMPPException e) {

// TODO Auto-generated catch block

e.printStackTrace();

//TerminalMessageManager.getInstance().addSysLog("xmpp","edit user error",GlobalResource.getInstance().ERROR);

}

}

--------------------

    public void add2FriendsGroup(String addr)

    {

    try {

connection.getRoster().createEntry(addr,

addr.substring(0, addr.indexOf("@")),

new String[] { "friends" });

catch (XMPPException e) {

// TODO Auto-generated catch block

 

 

e.printStackTrace();

//TerminalMessageManager.getInstance().addSysLog("xmpp","add user to friend error",GlobalResource.getInstance().ERROR);

}

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值