Android は XMPP フレームワークを使用してインスタント チャット (IM) 機能を実装します (Openfire + Smack)

概要

インスタント チャット機能は多くのアプリで必要とされています。QQ や WeChat などはすべてプライベート プロトコルを使用していますが、個人の開発者がインスタント チャット フレームワークを短期間で 0 から 1 まで作成するのは現実的ではありません。現在、Mogujie や XMPP など、IM 機能を提供するフレームワークやオープン プロトコルが多数存在します。XMPP は問題点もありますが、早くからリリースされているためヘルプドキュメントも充実しており、初心者や時間のない開発者には XMPP を使って IM 機能を実現するのが良いでしょう。

準備

サーバー側は Openfire をダウンロードして設定する必要がありますが、クライアント側は Smack を使用して実装します。
サーバー側では、クラウドサーバーを申請することをお勧めします。これにより、コンピューターの電源を常にオンにする必要がなく、構成がより便利になります。
サーバー側で Openfire を構成した後、サーバーのドメイン名を書き留めます。これは、後でクライアント プログラミングで使用されます。

クライアントはスマックを使用しています

デモンストレーションの例として Android Studio プログラミングを取り上げます。

権限設定、圧縮パッケージのインポートなど。

1.「AndroidManifest.xml」ファイルに次のコードを追加します。

<uses-permission android:name="android.permission.INTERNET" />

インスタント チャットはネットワークを使用する必要があるため、上記のコードの機能はネットワークの使用許可を申請することです。
2. 次のコードを「build.gradle」ファイルに追加します。

//导入smack相关
repositories {
    
    
    maven {
    
    
        url 'https://oss.sonatype.org/content/repositories/snapshots'
    }
    mavenCentral()
}
//导入smack相关
    implementation 'org.igniterealtime.smack:smack-android-extensions:4.2.0'
    implementation 'org.igniterealtime.smack:smack-experimental:4.2.0'
    implementation 'org.igniterealtime.smack:smack-tcp:4.2.0'

上記のコードの機能は、Smack 関連のリソース ファイル (圧縮パッケージ) をインポートすることです。この記事では Android Studio を例に挙げていますが、他のプラットフォームのリソース ファイルのインポート方法についても、公式 Web サイトに詳細なドキュメントが記載されています。

クライアントがサーバーに接続する

具体的なコードは次のとおりです。

public AbstractXMPPConnection mConnection(Context context) {
    
    
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        //设置XMPP域名
        try {
    
    
            configBuilder.setXmppDomain("0.0.0.0");
        } catch (XmppStringprepException e) {
    
    
            e.printStackTrace();
        }
        //设置主机位置(即服务器ip)
        try {
    
    
            configBuilder.setHostAddress(InetAddress.getByName("0.0.0.0"));
        } catch (UnknownHostException e) {
    
    
            e.printStackTrace();
        }
        //设置端口号
        configBuilder.setPort(5222);
        //设置不验证,否则需要TLS验证
        configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        //设置更改用户当前状态(在线、离线等)
        configBuilder.setSendPresence(false);
        AbstractXMPPConnection connection = new XMPPTCPConnection(configBuilder.build());
        // 连接到服务器
        try {
    
    
            connection.connect();
        } catch (SmackException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } catch (XMPPException e) {
    
    
            e.printStackTrace();
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        return connection;
    }

注:
1. 上記のコードの「0.0.0.0」は、前述した独自のサーバーのドメイン名です;
2. すべての小さな機能 (サーバーへの接続、登録、ログインなど) を次を使用して実装することをお勧めします。サブ関数を作成し、それらをインターフェイス転送として使用します。
3. すべての操作が完了したら、「.disconnect()」関数を呼び出してサーバーから切断します。

ユーザー登録・ログイン機能

(1) ユーザー登録機能:

connection = xmppManage.mConnection(LoginActivity.this);
                        AccountManager accountManager = AccountManager.getInstance(connection);
                        accountManager.sensitiveOperationOverInsecureConnection(true);
                        try {
    
    
                            accountManager.createAccount(Localpart.from(Username), Password);
                            //注册成功,则提示
                            Toast.makeText(LoginActivity.this,"注册成功,请登录!",Toast.LENGTH_SHORT).show();
                        } catch (SmackException.NoResponseException e) {
    
    
                            e.printStackTrace();
                        } catch (XMPPException.XMPPErrorException e) {
    
    
                            e.printStackTrace();
                        } catch (SmackException.NotConnectedException e) {
    
    
                            e.printStackTrace();
                        } catch (InterruptedException e) {
    
    
                            e.printStackTrace();
                        } catch (XmppStringprepException e) {
    
    
                            e.printStackTrace();
                        }
                        connection.disconnect();

(2) ユーザーログイン機能:

/**
     * 用户登录功能实现
     */
    public boolean login(String userName, String passWord, AbstractXMPPConnection connect) {
    
    
        Log.d("记录", "正在登录...");
        try {
    
    
            // 判断是否登录
            if (!connect.isAuthenticated()) {
    
    
                connect.login(userName, passWord);
                //接收离线信息,设为离线状态
                Presence presence = new Presence(Presence.Type.unavailable);
                connect.sendStanza(presence);
                Log.d("记录", "登录成功!");
                return true;
            }
            Log.d("记录", "已被登录,登录失败...");
            return false;
        } catch (XMPPException | SmackException | IOException e) {
    
    
            e.printStackTrace();
            Log.d("记录", "登录出错...");
            return false;
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
            return false;
        }
    }

注: オンライン ステータスではオフライン メッセージを受信できないため、ログインに成功した後、まずユーザー ステータスをオフラインに設定する必要があります。

オフラインメッセージを受信する

コードは以下のように表示されます。

/**
     * 用户接收离线消息功能实现
     */
    public List<Message> getOfflineMessage(AbstractXMPPConnection connection) throws Exception{
    
    
        //将用户状态设为离线
        Presence presence1 = new Presence(Presence.Type.unavailable);
        connection.sendStanza(presence1);
        OfflineMessageManager offlineManager = new OfflineMessageManager(connection);
        //获取离线消息
        List<Message> messageList = offlineManager.getMessages();
        offlineManager.getHeaders();
        int i = offlineManager.getMessageCount();
        Log.d("记录", "getMessageCount:"+i);
        //获取后删除离线消息记录
        offlineManager.deleteMessages();
        //将用户状态设为在线
        Presence presence = new Presence(Presence.Type.available);
        connection.sendStanza(presence);
        return messageList;
    }

注: 1. 上記のサブ関数はすべてのオフライン メッセージを返します;
2. オフライン メッセージを受信するときは、ユーザー ステータスをオフラインに設定する必要があります。

メッセージを受信/送信する

(1) メッセージを受信します。

/**
     * 消息监听,新消息提醒功能实现
     */
    public class InChatMessageListener implements IncomingChatMessageListener{
    
    
        @Override
        public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {
    
    
            //对接收到的信息进行操作
        }
    }

メッセージ リスナー (".removeListener(inListener)") は、APP を終了するとき ("onDestroy() メソッド" を呼び出すとき) に削除する必要があることに注意してください。

(2) メッセージの送信
コードは次のように比較的単純です。

try {
    
    
                    LoginActivity.xmppManage.SendMessage(LoginActivity.connection, ChatActivity.exist_friendname, mecessage_content);
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                }

追記

1. XMPPではチャットルーム(多人数チャット)などの機能も実装できます。
2. デバッグ時に Spark を利用できる Spark は、同じく XMPP で実装されており、機能が豊富なコンピュータ側のソフトウェアです。
3. Openfire の設定は数日前から行っているので、今後時間があれば追加してみます。
———————————————————————————————
最後に、私の個人的な公開アカウントを投稿します。WeChat で「Chaqian」を検索するか、下の写真をスキャンしてください。通常はプログラミング関連の記事が更新されるので、ぜひ注目してください〜
お茶の移動

おすすめ

転載: blog.csdn.net/weixin_46269688/article/details/110420351