Я искал четыре часа, и это сводит меня с ума.Я постараюсь сохранить это вкратце, если вам понадобится дополнительная информация / запрос кода, и я отредактирую.
Итак, у меня есть клиент 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 причиной блока?