目次
概要
インスタント チャット機能は多くのアプリで必要とされています。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」を検索するか、下の写真をスキャンしてください。通常はプログラミング関連の記事が更新されるので、ぜひ注目してください〜