首发:我的博客java
必须说明:smack最新的4.1.1,相对以前版本变化很大,并且资料缺少,官方文档也很差,因此仍是用老版本3.2.2吧。这篇博文中的代码是4.1.1版的,但不推荐用它。
用openfire作服务器,用spark作帮助调试的客户端,用smack(官方文档在这里,感受写得很是很差)作java的库,来完成即时通信功能。服务器
1.安装openfire
在官网下载安装便可。oracle
2.安装spark
在官网下载安装便可。jsp
3.maven引入smackmaven
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java7</artifactId>
<version>4.1.1</version>
<exclusions>
<exclusion>
<groupId>xpp3</groupId>
<artifactId>xpp3</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xpp3</groupId>
<artifactId>xpp3</artifactId>
<version>1.1.3.4.O</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-tcp</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-im</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-extensions</artifactId>
<version>4.1.1</version>
</dependency>tcp
若是提示找不到就手动安装一下吧,在maven仓库找到jar并手动下载以后,执行相似下面这条语句:ide
mvn install:install-file -Dfile={Path/to/your/ojdbc.jar} -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar函数
4.编写demo代码作实验
关键的概念:配置,链接,花名册,会话管理者,会话ui
import java.util.Collection;spa
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.chat.Chat;
import org.jivesoftware.smack.chat.ChatManager;
import org.jivesoftware.smack.chat.ChatManagerListener;
import org.jivesoftware.smack.chat.ChatMessageListener;
import org.jivesoftware.smack.filter.StanzaFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterListener;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;public class SmackClient { public static void countPeople(Roster r){ System.out.println("在线人数变为:" + r.getEntryCount()); } public static void go(){ try{ //对链接的配置 XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder(); builder.setUsernameAndPassword("guoguo", "cc19881031"); builder.setServiceName("127.0.0.1"); builder.setHost("127.0.0.1"); builder.setPort(5222); //不加这行会报错,由于没有证书 builder.setSecurityMode(SecurityMode.disabled); builder.setDebuggerEnabled(true); XMPPTCPConnectionConfiguration config = builder.build(); //创建链接并登录 AbstractXMPPConnection c = new XMPPTCPConnection(config); c.addPacketSendingListener(new StanzaListener(){ @Override public void processPacket(Stanza st) throws NotConnectedException { System.out.println("in StanzaListener:" + st.getFrom()); } }, new StanzaFilter(){ @Override public boolean accept(Stanza st) { System.out.println("in StanzaFilter:" + st.getFrom()); return false; } }); c.connect(); c.login(); final Roster roster = Roster.getInstanceFor(c); Presence p = roster.getPresence("admin@127.0.0.1"); System.out.println(p.getType()); roster.addRosterListener(new RosterListener() { public void entriesAdded(Collection<String> arg0) {countPeople(roster);} public void entriesDeleted(Collection<String> addresses) {countPeople(roster);} public void entriesUpdated(Collection<String> addresses) {countPeople(roster);} public void presenceChanged(Presence presence) {countPeople(roster);} }); // //设置是否在线状态,和状态说明// Presence presence = new Presence(Presence.Type.unavailable);// presence.setStatus("Gone fishing");// c.sendStanza(presence); //会话管理者的创建和配置监听 ChatManager chatmanager = ChatManager.getInstanceFor(c); chatmanager.addChatListener(new ChatManagerListener() { @Override public void chatCreated(Chat cc, boolean bb) { //当收到来自对方的消息时触发监听函数 cc.addMessageListener(new ChatMessageListener() { @Override public void processMessage(Chat cc, Message mm) { System.out.println(mm.getBody()); } }); } }); //创建会话 Chat chat = chatmanager.createChat("admin@127.0.0.1"); chat.getThreadID(); //发消息 Message msg = new Message(); msg.setBody("hello!"); chat.sendMessage(msg); while(true); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args) { go(); }}