Использование socket.io в android приложениях

Ответить
multimetr
Сообщения: 4
Зарегистрирован: 12 сен 2014, 23:57

Использование socket.io в android приложениях

Сообщение multimetr » 11 ноя 2014, 18:01

Здравствуйте, решил написать приложение для андройда, которое обменивается данными с сервером node.js(socket.io), для чего использую библиотеку Gottox - https://github.com/Gottox/socket.io-java-client
Все хорошо работает, только есть одна проблема, не могу отправить запрос на сервер по нажатию кнопки(Button).
Привожу пример кода:

Код: Выделить всё

package com.example.socketio_client;

import io.socket.IOAcknowledge;
import io.socket.IOCallback;
import io.socket.SocketIO;
import io.socket.SocketIOException;

import java.net.MalformedURLException;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		SocketIO socket;
		Button btn;
		
		btn = (Button) findViewById(R.id.btn);
		OnClickListener oclbtn = new OnClickListener() {
        	
            @Override
            public void onClick(View v) {
              // TODO Auto-generated method stub
          	socket.send("Hello"); // Не работает
            }
          };
          
          btn.setOnClickListener(oclbtn);
          
		
        try{
            System.out.println("Initializing Connection.");

            socket = new SocketIO("http://192.168.56.100:8080/");
            socket.connect
                (
                    new IOCallback(){
                        @Override
                        public void onMessage(JSONObject json, IOAcknowledge ack) {
                            try {
                                System.out.println("Server said:" + json.toString(2));
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onMessage(String data, IOAcknowledge ack) {
                         System.out.println("Server said: " + data);
                        }

                        @Override
                        public void onError(SocketIOException socketIOException) {
                            System.out.println("an Error occured");
                            socketIOException.printStackTrace();
                        }

                        @Override
                        public void onDisconnect() {
                            System.out.println("Connection terminated.");
                        }

                        @Override
                        public void onConnect() {
                         System.out.println("Connection established");
                        }

                        @Override
                        public void on(String event, IOAcknowledge ack, Object... args) {
                            System.out.println("Server triggered event '" + event + "'");
                        }
                    }
                );
            
            try {
                // This line is cached until the connection is established.
                System.out.println("Sending message to server.");
                socket.send("user message");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        socket.send("Hello"); // Так работает

        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }
		
	}
}

Среда разработки Eclipse, выдает следующую ошибку
Cannot refer to the non-final local variable socket defined in an enclosing scope

Вопрос, как мне по нажатию кпопки сделать запрос на сервер?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Использование socket.io в android приложениях

Сообщение doter.ua » 11 ноя 2014, 19:08

У тебя сокет создается в try catch, т.е. нет гарантии, что когда ты нажимаешь на кнопку будет существовать объект сокет.
почему бы не запихнуть весь этот кусок трай кэтч в метод онклик?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

multimetr
Сообщения: 4
Зарегистрирован: 12 сен 2014, 23:57

Re: Использование socket.io в android приложениях

Сообщение multimetr » 11 ноя 2014, 20:07

И что получается тогда, что каждый раз создавать новое подключение? Мне кажется это не очень правильно.

multimetr
Сообщения: 4
Зарегистрирован: 12 сен 2014, 23:57

Re: Использование socket.io в android приложениях

Сообщение multimetr » 20 ноя 2014, 14:46

Этот вопрос решил, сообщения отправляются, все хорошо. Есть вопрос как повесить обработчик на входящее сообщение? Как получить сообщение отправляемое сервером?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Использование socket.io в android приложениях

Сообщение altwin » 20 ноя 2014, 20:36

multimetr писал(а):Этот вопрос решил, сообщения отправляются, все хорошо. Есть вопрос как повесить обработчик на входящее сообщение? Как получить сообщение отправляемое сервером?
delegation.
Изображение

ihitmani
Сообщения: 8
Зарегистрирован: 26 ноя 2014, 01:04

Re: Использование socket.io в android приложениях

Сообщение ihitmani » 26 ноя 2014, 02:01

multimetr писал(а):Этот вопрос решил, сообщения отправляются, все хорошо. Есть вопрос как повесить обработчик на входящее сообщение? Как получить сообщение отправляемое сервером?
не знаешь как читай исходник!
https://github.com/Gottox/socket.io-java-client

SocketIO socket = new SocketIO("http://127.0.0.1:3001/");
socket.connect(new IOCallback() {
@Override
public void onMessage(JSONObject json, IOAcknowledge ack) {
try {
System.out.println("Server said:" + json.toString(2));
} catch (JSONException e) {
e.printStackTrace();
}
}

Ответить