Реализация чата на сервере

Я занимаюсь разработкой пользовательского приложения 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();
  }

}
Другие вопросы по тегам