Реализация чата на сервере
Я занимаюсь разработкой пользовательского приложения androaid. И я хочу добавить возможность общения пользователей друг с другом. Кроме того, я хочу, чтобы пользователи могли видеть, кто в сети. Я использую Android в качестве клиентской стороны. И python как серверная сторона. Я могу сделать это не просто, но понятия не имею, с чего начать. Поэтому я буду оценивать каждую помощь. Спасибо
1 ответ
Вам нужно будет включить чат-клиент XMPP в ваше приложение для Android. Самый популярный из них - Asmack. На самом деле это библиотека C++, преобразованная в библиотеку jar с использованием JNI. Вы включаете JAR-файл asmack в папку libs. Затем вы просто импортируете необходимые классы из пространства имен org.jivesoftware.smack.
https://github.com/Flowdalic/asmack
На стороне сервера вам понадобится чат-сервер, такой как OpenFire. Это довольно легко установить в Linux, и вам не нужно будет писать код Python, чтобы позволить клиенту Android подключиться к нему.
http://www.igniterealtime.org/projects/openfire/
Вот сервис, который я написал для связи с сервером чата.
XMPPService.java
package com.qeala.android;
import java.util.ArrayList;
import java.util.List;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.Message;
import android.os.Handler;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
public class XMPPService extends Service {
private static String TAG = "XMPPService";
private int mStartMode;
private IBinder mBinder;
private boolean mAllowRebind;
public Handler mHandler;
public static final int MSG_ON_MESSAGE = 10;
public static final int MSG_ON_CONNECTED = 11;
public static final String ACTION_MESSAGE = "ACTION_MESSAGE";
public static final String ACTION_CONNECTED = "ACTION_CONNECTED";
private static final String SERVER_URL = "yourserver.com"
private Connection mConnection;
private ChatManager mChatManager;
private Chat mChat;
@Override
public void onCreate() {
Log.d(TAG, "onCreate");
mStartMode = START_STICKY_COMPATIBILITY;
mBinder = new LocalBinder();
mAllowRebind = false;
mHandler = new Handler(getMainLooper()){
public void handleMessage (Message msg){
Intent intent = new Intent();
switch (msg.what) {
case MSG_ON_MESSAGE:
String message = (String)msg.obj;
intent.setAction(ACTION_MESSAGE);
intent.putExtra("message", message);
sendBroadcast(intent);
break;
case MSG_ON_CONNECTED:
intent.setAction(ACTION_CONNECTED);
sendBroadcast(intent);
break;
}
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String action = intent.getAction();
Log.d(TAG, String.format("onStartCommand:%s:%d:%d", action, flags, startId));
}
return mStartMode;
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind");
return mAllowRebind;
}
@Override
public void onRebind(Intent intent) {
Log.d(TAG, "onRebind");
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
}
public class LocalBinder extends Binder {
public XMPPService getServerInstance() {
return XMPPService.this;
}
}
public void sendMessage(final String message){
new Thread(new Runnable(){
@Override
public void run() {
if(mConnection != null){
if(mConnection.isConnected()){
if(mChat != null){
try {
Log.d(TAG, String.format("SEND: %s", message));
mChat.sendMessage(message);
} catch (XMPPException e) {
Log.e(TAG, e.toString());
}
}else{
Log.d(TAG, "mChat is null");
}
}else{
Log.w(TAG, "mConection is not connected");
}
}else{
Log.w(TAG, "mConection is null");
}
}
}).start();
}
public void connect(final String jid){
Log.d(TAG, String.format("connect %s", jid));
new Thread(new Runnable(){
@Override
public void run() {
try{
Connection.DEBUG_ENABLED = true;
mConnection = new XMPPConnection(SERVER_URL);
mConnection.connect();
mConnection.loginAnonymously();
mChatManager = mConnection.getChatManager();
mChat = mChatManager.createChat(jid, new MessageListener() {
public void processMessage(Chat chat, org.jivesoftware.smack.packet.Message message) {
String body = message.getBody();
Log.d(TAG, String.format("RECEIVE: %s", body));
Message msg = mHandler.obtainMessage(MSG_ON_MESSAGE, body);
mHandler.sendMessage(msg);
}
});
Message msg = mHandler.obtainMessage(MSG_ON_CONNECTED);
mHandler.sendMessage(msg);
}catch(Exception e){
Log.e(TAG, e.toString());
}
}
}).start();
}
}