Android verwendet das XMPP-Framework, um die Instant-Chat-Funktion (IM) zu implementieren (Openfire + Smack).

Überblick

Die Instant-Chat-Funktion wird nur von vielen APPs benötigt. QQ, WeChat usw. verwenden alle private Protokolle, aber es ist für einzelne Entwickler nicht realistisch, in kurzer Zeit ein Instant-Chat-Framework von 0 auf 1 zu schreiben. Mittlerweile gibt es viele Frameworks oder offene Protokolle, die IM-Funktionen bereitstellen, wie zum Beispiel Mogujie und XMPP. Obwohl XMPP einige Probleme aufweist, wurde es früh eingeführt, sodass es viele Hilfedokumente gibt. Für Anfänger oder Entwickler mit wenig Zeit ist die Verwendung von XMPP zur Realisierung der IM-Funktion eine gute Wahl.

Vorbereitung

Die Serverseite muss Openfire herunterladen und konfigurieren, während die Clientseite Smack zur Implementierung verwendet.
Auf der Serverseite empfiehlt es sich, einen Cloud-Server zu beantragen, damit Ihr Computer nicht ständig eingeschaltet sein muss und die Konfiguration wesentlich komfortabler ist.
Nachdem Sie Openfire serverseitig konfiguriert haben, notieren Sie sich den Domänennamen Ihres Servers, der später bei der Client-Programmierung verwendet wird.

Der Kunde verwendet Smack

Zur Demonstration nehmen wir die Android Studio-Programmierung als Beispiel.

Berechtigungskonfiguration, Import komprimierter Pakete usw.

1. Fügen Sie den folgenden Code in die Datei „AndroidManifest.xml“ ein:

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

Die Funktion des obigen Codes besteht darin, die Erlaubnis zur Nutzung des Netzwerks zu beantragen, da für den Sofortchat die Nutzung des Netzwerks erforderlich ist.
2. Fügen Sie den folgenden Code in die Datei „build.gradle“ ein:

//导入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'

Die Funktion des obigen Codes besteht darin, Smack-bezogene Ressourcendateien (komprimierte Pakete) zu importieren. In diesem Artikel wird Android Studio als Beispiel verwendet. Die Importmethoden für Ressourcendateien anderer Plattformen finden sich ebenfalls ausführlich auf der offiziellen Website.

Der Client stellt eine Verbindung zum Server her

Der spezifische Code lautet wie folgt:

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;
    }

Hinweis:
1. „0.0.0.0“ im obigen Code ist der oben genannte Domänenname Ihres eigenen Servers;
2. Es wird empfohlen, alle kleinen Funktionen (z. B. Verbindung zum Server, Registrierung, Anmeldung usw.) mit zu implementieren Unterfunktionen, und verwenden Sie sie dann als Schnittstellenübertragung.
3. Nachdem alle Vorgänge abgeschlossen sind, rufen Sie die Funktion „.disconnect()“ auf, um die Verbindung zum Server zu trennen.

Benutzerregistrierungs-/Anmeldefunktion

(1) Benutzerregistrierungsfunktion:

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) Benutzer-Login-Funktion:

/**
     * 用户登录功能实现
     */
    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;
        }
    }

Hinweis: Nach erfolgreicher Anmeldung muss zunächst der Benutzerstatus auf offline gesetzt werden, da der Online-Status keine Offline-Nachrichten empfangen kann.

Offline-Nachrichten empfangen

Code wie folgt anzeigen:

/**
     * 用户接收离线消息功能实现
     */
    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;
    }

Hinweis: 1. Die obige Unterfunktion gibt alle Offline-Nachrichten zurück.
2. Beim Empfang von Offline-Nachrichten sollte der Benutzerstatus auf „Offline“ gesetzt werden.

Nachrichten empfangen/senden

(1) Nachrichten empfangen:

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

Beachten Sie, dass der Nachrichten-Listener („.removeListener(inListener)“) beim Verlassen der APP (beim Aufruf der „onDestroy()-Methode“) entfernt werden sollte.

(2) Senden Sie eine Nachricht.
Der Code ist relativ einfach und lautet wie folgt:

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

Nachwort

1. XMPP kann auch Funktionen wie Chatrooms (Mehrpersonen-Chat) implementieren.
2. Beim Debuggen können Sie Spark verwenden. Spark ist eine Software auf der Computerseite, die ebenfalls von XMPP implementiert wird und über umfangreiche Funktionen verfügt.
3. Die Konfiguration von Openfire wurde bereits mehrere Tage lang durchgeführt und ich werde versuchen, sie hinzuzufügen, wenn ich in Zukunft Zeit habe.
——————————————————————————————
Zum Schluss poste ich mein persönliches öffentliches Konto: WeChat-Suche „Chaqian“ oder scannen Sie das Bild unten. Normalerweise werden einige programmbezogene Artikel aktualisiert, und jeder ist herzlich eingeladen, darauf zu achten ~
Tee bewegen

Supongo que te gusta

Origin blog.csdn.net/weixin_46269688/article/details/110420351
Recomendado
Clasificación