2016-05-10 3 views
0

Я использую socket.io на моем приложении для андроид-чата. Чтобы поддерживать связь, я подключаю сокет к сервису, который запускается в основном режиме. И я проверяю, подключен ли сокет. Если это не так, я делаю сокет. Вот мои коды:Socket.io java клиент получает одно и то же сообщение более одного раза

try { 
     mSocket = IO.socket("http://192.168.x.x:XXXX"); 
    } catch (URISyntaxException e) { 
     throw new RuntimeException(e); 
    } 

    if(!mSocket.connected()){ 
     mSocket.connect(); 
    } 

    mSocket.on("new message", onNewMessage); 
    mSocket.on("user joined", onUserJoined); 
    mSocket.emit("add user", "MobileUser"); 

    message += cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE); 
    sendMessage(); 

public void sendMessage(){ 
    mSocket.emit("new message", message); 
    addMessage("MobileUser", message); 
} 

Соединения прекрасно работают. Моя служба отправляет сообщение через сокет каждую минуту. Это кажется, что это в другом клиенте:

MobileUser: 1:11 
MobileUser: 1:12 
MobileUser: 1:13 
MobileUser: 1:14 
MobileUser: 1:15 

Вот моя проблема: После этих 5 сообщений (5 раз это всего лишь пример, это может быть любое число больше 1), если другой клиент посылает сообщение, я получаю это сообщение 5 раз. Но, конечно, я хочу получить это сообщение на этот раз. Как я могу справиться с этой проблемой? Какие-либо предложения?

Edit:

Мой onNewMessage метод на стороне клиента:

private Emitter.Listener onNewMessage = new Emitter.Listener() { 
public void call(final Object... args) { 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      JSONObject data = (JSONObject) args[0]; 
      try { 
       username = data.getString("username"); 
       message = data.getString("message"); 
      } catch (JSONException e) { 
       return; 
      } 

      Log.v(username, message); 
     } 
    }); 

    t.start(); 
    } 
}; 

и "новое сообщение" событие на моем сервере:

socket.on('new message', function (data) { 
    console.log('message: ' + data); 

    socket.broadcast.emit('new message', { 
     username: socket.username, 
     message: data 
    }); 
}); 
+0

Что вы делаете в методе onNewMessage? Кажется, что вы слушаете и отправляете событие «нового сообщения» на своем сервере, что может быть проблемой – risuch

+0

Да, вы правы. Я собираюсь изменить свой вопрос, добавив метод onNewMessage. @risuch – zeynepsam

+0

Пока ничего не выглядит ошибочным, но его не совсем понятно, что все части задействованы в вашем приложении клиент-сервер, поэтому его сложно разработать. Возможно, вы захотите загрузить какой-либо плункер или чтобы отображалась полная информация. Также кажется, что ваш сервер - node.js и Client Java, правильно? И все клиенты используют один и тот же код и подключаются к одному и тому же серверу? – risuch

ответ

0

Я думаю, что я нашел решение. Я должен проверить, если сокет подключен или нет в моем классе обслуживания, но эти коды не должны быть там:

mSocket.on("new message", onNewMessage); 
mSocket.on("user joined", onUserJoined); 
mSocket.emit("add user", "MobileUser"); 

я удалил их из моего класса обслуживания и поставить класс MainActivity. Проблема решена.