Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Помогите разобраться с работой библиотеки Socket.IO-client Java

#java #android #сокет

                    
Хочу воспользоваться библиотекой  compile 'io.socket:socket.io-client:0.6.1', вот ссылка

И я смог настроить соединение с сервером. Когда я соединяюсь, сервер видит клиента,
и даже получает шаблонное сообщение. Но дальше я не могу передавать сообщения на сервер.
Вот кусочек кода, который отвечает за подключение:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView status;
    private Button button;
    private Socket socket;
    {
        try {
            socket = IO.socket(Constants.CHAT_SERVER_URL);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        status = (TextView) findViewById(R.id.status);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);

        socket.connect();
        if (socket.connected()) {
            status.setText("Connected");
        } else {
            status.setText("Disconnected");
        }
    }


Я запускаю приложение, создается сокет, и на сервере срабатывает событие о том, что
клиент подключился. Это после строчки socket.connect(); А так же на сервере видно такие
логи:

Welcome to Server side
Waiting for a client...Client connected
Wait for messages
GET /socket.io/?EIO=3&transport=polling HTTP/1.1
User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.7; Android SDK built for x86 Build/GINGERBREAD)
Host: 10.0.2.2:4444
Connection: Keep-Alive
Accept-Encoding: gzip


То есть, клиент действительно присоединился, и отправил какие то данные. Но дальше
непонятно. Первое это то, что не срабатывает мое условие:

if (socket.connected()) {
                status.setText("Connected");
            } else {
                status.setText("Disconnected");
            }


потому-что socket.connected() возвращает false. НО на стороне сервера показано, что
соединение установлено (если я закрою клиента, то и сервер говорит, что соединение
разорвано). Выходит, сервер видит, что клиент присоединен, но на клиенте говорится,
что соединения нет. И при попытке отправить сообщение на сервер:

@Override
    public void onClick(View v) {
        if (v.getId() == R.id.button) {
            socket.send("::::::::::::::::::::::::::::::::::::::::::::");
        }
    }


НИЧЕГО НЕ ПРОИСХОДИТ!

Как проверить или сделать, чтобы все заработало?

Мне просто нужно String  посылать на сервер и ВСЕ.

Вот код СЕРВЕРА:

public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("Welcome to Server side");
        BufferedReader in = null;
        PrintWriter out = null;

        ServerSocket servers = null;
        Socket fromclient = null;

        // create server socket
        try {
            servers = new ServerSocket(4444);
        } catch (IOException e) {
            System.out.println("Couldn't listen to port 4444");
            System.exit(-1);
        }

        try {
            System.out.print("Waiting for a client...");
            fromclient = servers.accept();
            System.out.println("Client connected");
        } catch (IOException e) {
            System.out.println("Can't accept");
            System.exit(-1);
        }

        in = new BufferedReader(new InputStreamReader(fromclient.getInputStream()));
        out = new PrintWriter(fromclient.getOutputStream(), true);
        String input, output;

        System.out.println("Wait for messages");
        while ((input = in.readLine()) != null) {
            System.out.println(input);
        }
        out.close();
        in.close();
        fromclient.close();
        servers.close();
    }
}

    


Ответы

Ответ 1



Во первых: Библиотека ассинхронная. Что это значит? То, что следующий код socket.connect(); if (socket.connected()) { status.setText("Connected"); } else { status.setText("Disconnected"); } Всегда войдет в else. потому, что socket.connect() - ассинхронный метод, выполняется в отдельном потоке, и если сразу же спросить у сокета socket.connected(), то он вернет false, потому, что connect не успел еще выполниться. Вместо этого надо повесить Listener перед тем, как вызвать connect: socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... args) { //делаем все, что надо сделать после успешного коннекта } }) На счет остального - проверьте код сервера, мне показалось, что он должен обработать только первый коннект, и сразу завершиться.

Комментариев нет:

Отправить комментарий