使用之前先下载Smack,然后把Smack开发的jar引入到项目中。
package com.bis.smack.client;
import java.util.Collection;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.PacketListener;
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.Packet;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smackx.ChatState;
import org.jivesoftware.smackx.muc.InvitationListener;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.packet.ChatStateExtension;
import org.junit.Test;
public class SmackDemos {
private static XMPPConnection connection = new XMPPConnection("wang-think");
private static String USRE_NAME = "majian";
private static String PASSWORD = "majian";
static{
try {
connection.connect();
connection.login(USRE_NAME,PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*创建连接接收消息
*/
@Test
public void testRecieveMessage()throws Exception{
//创建一个聊天对话,接收m用户的消息 ,并发送消息给m用户
//其中m@wang-think,m是指m用户名,wang-think是指m所登陆的机器---jid
Chat chat = connection.getChatManager().createChat("m@wang-think",
new MessageListener() {
@Override
public void processMessage(Chat arg0, Message message) {
System.out.println("Received message: "+ message.getBody());
}
});
Message msg = new Message();
chat.sendMessage("Howdy!");
while(true);//死循环,保持连接不被中断
}
/**
*连接管理
*/
@Test
public void testConnectionManager()throws Exception{
ConnectionConfiguration config = new ConnectionConfiguration("wang-think");
config.setCompressionEnabled(true);
config.setSASLAuthenticationEnabled(true);
connection = new XMPPConnection(config);
connection.connect();
connection.login("majian", "majian", "SomeResource");
// Disconnect from the server
//connection.disconnect();
while(true);
}
/**
* 获取好友列表
*/
@Test
public void testLoadRoster()throws Exception{
Roster roster = connection.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries) {
System.out.println(entry);
}
}
/**
*发送消息
*/
@Test
public void testSendMessage()throws Exception{
// XMPPConnection.DEBUG_ENABLED = true;
// 创建一个和m的对话,并设置信息监听
Chat mychat = connection.getChatManager().createChat("m@wang-think",
new MessageListener() {
@Override
public void processMessage(Chat arg0, Message message) {
String messageBody = message.getBody();
System.out.println("收到信息:" + messageBody);
}
});
// 发送给m文本信息
mychat.sendMessage("hello");
// 退出登陆
while(true);
}
/**
*设置自己的登陆状态
*/
@Test
public void testSeetOwnState()throws Exception{
// XMPPConnection.DEBUG_ENABLED = true ;
// 设置服务器地址
// 设置登陆后的个人状态信息
Presence p = new Presence(Presence.Type.available);
p.setStatus("无聊中。。。");
connection.sendPacket(p);
while (true);
// 退出登陆
// conn.disconnect();
}
/**
* 聊天窗口输入状态,使用XEP-0085 协议
*/
@Test
public void testTalkState()throws Exception{
Message mess = new Message();
mess.addExtension(new ChatStateExtension(ChatState.composing));
mess.setBody("这是测试数据");
Chat mychat = connection.getChatManager().createChat("m@wang-think",
new MessageListener() {
@Override
public void processMessage(Chat arg0, Message message) {
String messageBody = message.getBody();
System.out.println("收到信息:" + messageBody);
}
});
// 发送给m文本信息
mychat.sendMessage(mess);
// 退出登陆
while(true);
}
/**
*聊天窗口输入状态,接收端处理逻辑
*/
@Test
public void testTalkStateRecieveClient()throws Exception{
// 创建一个和test1的对话,并设置信息监听
Chat mychat = connection.getChatManager().createChat("m@wang-think",
new MessageListener() {
@Override
public void processMessage(Chat arg0, Message message) {
PacketExtension pe;
String messageBody = message.getBody();
pe = message.getExtension("composing" , "http://jabber.org/protocol/chatstates" );
if (pe != null ){
System.out.println("对方正在输入......" );
}
pe = message.getExtension("active" , "http://jabber.org/protocol/chatstates" );
if (pe != null ){
System.out.println("接收到信息:" +messageBody);
}
pe = message.getExtension("paused" , "http://jabber.org/protocol/chatstates" );
if (pe != null ){
System.out.println("对方已暂停输入" );
}
pe = message.getExtension("inactive" , "http://jabber.org/protocol/chatstates" );
if (pe != null ){
System.out.println("对方聊天窗口失去焦点" );
}
pe = message.getExtension("gone" , "http://jabber.org/protocol/chatstates" );
if (pe != null ){
System.out.println("对方聊天窗口被关闭" );
}
}
});
// 发送给test1文本信息
mychat.sendMessage("hello");
}
/**
*接收邀请,加入多人聊天房间
*/
@Test
public void testYaoQingSevralUserTalk()throws Exception{
MultiUserChat.addInvitationListener(connection, new InvitationListener() {
@Override
public void invitationReceived(Connection conn, String room,
String inviter, String reason, String password, Message message) {
MultiUserChat multiUserChat = new MultiUserChat(conn, room);
System.out.println("收到来自 " +inviter+ " 的聊天室邀请。邀请附带内容:" +reason);
try {
multiUserChat.join("test2" , password);
} catch (XMPPException e) {
System.out.println("加入聊天室失败" );
e.printStackTrace();
}
System.out.println("成功加入聊天室" );
multiUserChat.addMessageListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
Message message = (Message)packet;
//接收来自聊天室的聊天信息
System.out.println(message.getFrom()+":" +message.getBody());
}
});
//发送信息到聊天室
try {
multiUserChat.sendMessage("新手到来,大家关照!");
} catch (XMPPException e) {
e.printStackTrace();
}
}
});
while(true);
}
/**
* 登陆GTalk用户,并查询该用户的所有好友列表
*/
@Test
public void testLogOnGtalk()throws Exception{
XMPPConnection conn = new XMPPConnection( new ConnectionConfiguration( "talk.google.com" , 5222 , "gmail.com" ));
conn.connect();
//输入gtalk的账号密码
conn.login("88888888" , "8888888888" );
Collection<RosterEntry> rosters = conn.getRoster().getEntries();
//获取gtalk上的好友列表
System.out.println("我的好友列表:=======================" );
for (RosterEntry rosterEntry : rosters){
System.out.print("name: " +rosterEntry.getName()+ ",jid: " +rosterEntry.getUser());
System.out.println("" );
}
System.out.println("我的好友列表:=======================" );
conn.disconnect();
}
}