第四:客户端要进行处理,处理的是 ,客户端登陆的时候,要进行监听,如果客户端登陆了,进行addPacketListener
spark插件代码如下:
public class GroupChatPlugin implements Plugin,PacketListener {
@Override
public boolean canShutDown() {
// TODO Auto-generated method stub
return false;
}
@Override
public void initialize() {
SparkManager.getConnection().addPacketListener(this,new MessageTypeFilter(Message.Type.groupchat));
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
}
@Override
public void uninstall() {
// TODO Auto-generated method stub
}
@Override
public void processPacket(Packet message) {
System.out.println(message.toXML());
String to=message.getFrom();
String roomname=to.substring(0, to.indexOf("@"));
String roomjid=to.substring(0, to.indexOf("/"));
System.out.println("来消息了啊 roomname"+roomname+" roomjid"+roomjid);
try {
ChatManager chatManager = SparkManager.getChatManager();
GroupChatRoom chatRoom = (GroupChatRoom)chatManager.getChatContainer().getChatRoom(roomjid);
return;
}
catch (ChatRoomNotFoundException e) {
ConferenceUtils.joinConferenceOnSeperateThread(roomname, roomjid, null);
System.out.println("ChatRoomNotFoundException");
}
}
}
主要作用就是监听packet 判断如果GroupChatRoom 没有的话,进行加入。
另外,spark默认的是客户如果关闭了聊天室,就会自动从群里退出。这个要处理服务端,客户端不需要处理,处理的是spark往openfire发送packet的时候,openfire捕获,但是不进行任何处理,这个要修改下面的代码
在openfire的localMUCuser 找到这两行代码 注释掉就可以
// removeRole(group);
// role.getChatRoom().leaveRoom(role);
还是在localMUCUser这个类里面 找到 public void process(Presence packet) 这个方法 找到 role.getChatRoom().presenceUpdated(role, packet); 这行代码 然后再下面加入
LocalMUCRoom room = (LocalMUCRoom) server.getChatRoom(group, packet.getFrom());
room.sendInitialPresences((LocalMUCRole) role);// 给客户端进行会员更新
在写上面的两行代码之前 ,还要对localmucroom的sendInitialPresences 修改为public 不然不能引用