openfire client 端開發範例.docx
一、圖說
說明:
1. 公司內部或第三方開發的伺服端服務(如ERP、財會、流程等),透過尋得相對應語言且支援XMPP的程式庫,便可將訊息發往 openfire server,讓終端使用者收到訊息;這類支援XMPP的程式庫有開源免費的,也有需要收錢的。例如:如果 ERP 系統是 java 語言開發,便可利用 openfire 官方提供的 smack library(免費),建立起與 openfire server 的通訊。假如公司內部的流程系統是使用 C# 開發,那就需要一個支援 XMPP 的 .NET 程式庫,如 Matrix(收費)。
2. 如果要開發自己的桌機版或行動版的即時通訊終端軟體(Instant messaging client 簡稱 IM client,例如 Skype client、MSN messager、Yahoo Messager、Pidgin等...都算是,只是支援的通訊協定不同。),同第1點說明,只要尋找相對應語言程式庫即可。當然要從頭開始,自行開發 XMPP 的通訊程式庫也無不可,假如時間很多的話。
3. 桌機版或行動版的 IM client 現成軟體不少,當中也有很多是免費的,例如 pidgin,openfire 官方社群也有提供免費的 IM client,名為spark。不過在尋找這類IM client時,要注意必須有支援 XMPP 或 jabber 字樣,方能與 openfire 溝通。
pidgin
spark
行動版不管 iOS 或 Android也有多個 IM App 可供選擇
Android參考(10 best free apps for xmpp client)
http://appcrawlr.com/android-apps/best-free-apps-xmpp-client
iOS 參考(Top10 Apps for Jabber Xmpp iPhone/iPad)
http://appcrawlr.com/ios-apps/best-apps-jabber-xmpp
二、java 使用 smack 程式庫為例(桌機或第三方整合適用)。
網址:
openfire 除了有伺服軟體外,還提供了 smack 這個程式庫,這是一個 java library,透過這個程式庫,可以省去與通訊伺服器間繁雜的 XMPP 協定處理。
通訊伺服器位址:192.168.1.112
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
傳送訊息:考核開始通知
訊息接收者帳號:e00104
import org.jivesoftware.smack.*;
public class Main {public static void main(String[] args) {final ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.112",Integer.parseInt("5222"));//允許自動連接
config.setReconnectionAllowed(true);
config.setSendPresence(true);
AccountManager accountManager;Connection connection = new XMPPConnection(config);
try {
connection.connect();accountManager = connection.getAccountManager();connection.login("test1" , "test1");System.out.println(connection.getUser());connection.getChatManager().createChat("e00104@fire1",null).sendMessage("考核開始通知");}catch (XMPPException e){
System.out.println("Connect error:" + e);
}}}
三、C# 使用 Matrix 程式庫為例(桌機或第三方整合適用)。
網址:http://www.ag-software.net/matrix-xmpp-sdk/
原理同 smack,只是支援語言不同,Matrix library 可以免費試用,使用時會出現延遲對話框,如果付費,就不會跳出延遲框。
Matrix 是 agsXMPP 版本的成功穩定版,agsXMPP 是免費的,官方建議商業正式環境中,應使用 Matrix 這個版本。
通訊伺服器位址:192.168.1.112
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Matrix;
using Matrix.Xmpp;
using Matrix.Xmpp.Client;
namespace hlchat
{public partial class Form1 : Form{public Form1()
{InitializeComponent();}private void button1_Click(object sender, System.EventArgs e){XmppClient xmppClient = new XmppClient { XmppDomain="fire1", Username="test1", Password="test1" };xmppClient.OnRosterEnd += delegate
{ xmppClient.Send(new Matrix.Xmpp.Client.Message
{To=TargetUser.Text,Type=MessageType.chat,Body=MsgBody.Text});};xmppClient.Open();textBox1.Text = "Send OK!!";
//xmppClient.Close();
}}}
四、java 使用 asmack 程式庫為例(Android App 開發適用)。
網址:https://code.google.com/p/asmack/
asmack 算是 smack 的修正版,網路大部分討論都建議開發 Android 端使用 asmack 而非 smack。
通訊伺服器位址:192.168.1.31
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
傳送訊息:hello asmak
訊息接收者帳號:t001
package net.snoone.schat;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.*;
import java.util.Collection;
public class MyActivity extends Activity{/** Called when the activity is first created. */
public static final String HOST = "192.168.1.31";public static final int PORT = 5222;public static final String SERVICE = "jabber";@Overridepublic void onCreate(Bundle savedInstanceState){StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);super.onCreate(savedInstanceState);
setContentView(R.layout.main);createChat();}private void createChat(){ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT, SERVICE);
XMPPConnection connection = new XMPPConnection(connConfig);
try {
connection.connect();connection.login("test1", "test1");Message msg = new Message("t001@of1", Message.Type.chat);msg.setBody("hello asmak");
connection.sendPacket(msg);}catch (XMPPException e){
connection = null;
}}}