Android-клиент / сокет Java-сервера;андроид отправляет, но не получает? - PullRequest
5 голосов
/ 08 августа 2011

Я искал четыре часа, и это сводит меня с ума.Я постараюсь сохранить это вкратце, если вам понадобится дополнительная информация / запрос кода, и я отредактирую.

Итак, у меня есть клиент Android, который подключается к серверу с помощью PrintWriter и BufferedReader.Это работает так, как будто запускает новый ASyncTask () для загрузки соединения.Когда соединение установлено, оно отправляет сообщение «Join» на сервер, а затем загружает поток прослушивания, который имеет цикл while, ожидающий UserInput.readLine ()! = Null, и после разрыва он возвращает строку, запускающую процессфункция, которая принимает строку и выполняет ее действие, и перезагружает задачу прослушивания.

 //Listener thread
class listen extends AsyncTask<Integer, Integer, Void> {

    @Override
    protected Void doInBackground(Integer... params) {
        //Disconnect variable that's only turned true on backpress
        if (!disconnect) {
            try {
                message = Connection.listen(); //socket object
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // async task finished
        if (!disconnect) {

            say("INCOMMING"); //easy-made function for Toast
            input(message);
        }

    }

}

и в этом соединении:

public String listen() throws IOException {
    String userInput;

    while ((userInput = in.readLine()) != null) {

    }

    return userInput;
}

Теперь в моем приложении Java на сервере у меня есть потоккоторый загружает другие потоки соединения в ArrayList и действует как штаб-квартира для отправки сообщений всем дочерним клиентам

В моем соединении:

            while ((inputLine = in.readLine()) != null) {   
                            //Tells HQ to process string, with id being who it's coming from
                hq.Process(id, inputLine);
                if (!connected)
                    break;
            }

в объекте HQ:

public void Process(int id, String str) {
     String[] msg = str.split(","); //split message
     String send = " "; //string I print to console

     if (msg[0].equals("join")) {
         send = msg[1] + " has joined!";
         parent.seats[cnew.get(id).seat] = id;
         cnew.get(id).sendData();
         System.out.println(id);
     }

А после объединения штаб-квартира сообщает об этом соединении, чтобы отправить информацию об этом игроке на телефон

   public void sendData() {
       out.println("chips," + chips); // Update chip count

               //give player his cards
       out.println("card," + hq.parent.gameCards.getCard(10) + ","
               + hq.parent.gameCards.getCard(11));

              //a cry for help to get some output on the phone
       out.println("error,SAY THIS");

      // out.flush(); //commented out because it didn't help at all

       System.out.println("sending id " + id); //debug checker (ignore this)
   }

Моя проблема в том, что это сработало, когда я подключил четыре телефона, и все они отправили тосты друг другу.Но как только я изменил его, чтобы отправить обратно данные, как только игрок подключается, я не получаю ответ в Android вообще.

Я не могу понять, почему это не работает.На стороне сервера все проходит (проверено с помощью system.prints).Соединение установлено, и когда я нажимаю кнопки на телефоне, сервер выводит свои ответы.Но телефон ничего не получает - я до сих пор не знаю, не отправляет ли сервер сообщение или телефон не читает.Вы видите что-нибудь в коде, что может быть причиной этого?Нужно увидеть больше?Или есть какие-либо советы о том, как отладить состояние подключения?Задача listen () больше не завершает свое выполнение.

ОБНОВЛЕНИЕ: Итак, я понял, что это, вероятно, связано с моим циклом while () на стороне андроида, до, вероятно, никогда не прерывается.Глупая ошибка.Но я попытался добавить это в качестве тестера, и все равно ничего:

public String listen() throws IOException {
    String userInput;

    while ((userInput = in.readLine()) != null) {
        if (userInput.length() > 2)
            break;
    }

    return userInput;
}

ОБНОВЛЕНИЕ: следующее отчаянное обновление - когда я нажимаю "назад" (который отправляет сообщение о выходе из системы на сервер, который закрывает соединение, и вызывает.close и rest.close) затем я получаю бесконечный цикл "MSG" Toast - The Toast, который я ставлю, когда ввод распознается.Является ли out.close причиной блока?

1 Ответ

2 голосов
/ 09 августа 2011

Получается, что println на стороне сервера не печатал новую строку - добавление + "\ n" в конце сообщений сервера заставило его пройти. Зачем? Я не знаю ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...