Я создаю программу чата, в которой хосты подключаются через сокеты и общаются друг с другом с помощью потоков ObjectInput и ObjectOutput. Хост строит строку из ввода с клавиатуры и отправляет ее другим хостам вместе с массивом целых чисел.
После того, как хост успешно прочитал сообщение с помощью readObject (), цикл while (true) продолжается, и этот хост зависает при следующем вызове readObject (). Я могу только предположить, что это потому, что indata.available () возвращает true даже после чтения того, что было в нем, и когда он пытается прочитать снова, прежде чем что-то еще было отправлено, он блокирует (ждет).
Ниже приведен фрагмент соответствующего кода. Я провел некоторое исследование и обнаружил, что не могу очистить или очистить поток ввода. Я также не могу закрыть его - из-за природы постоянно работающей программы чата, она должна оставаться открытой, чтобы продолжить чтение.
Кроме того, я понимаю, что я проверяю indata.available () и затем читаю с использованием input.readObject (). Я думал, что это был правильный способ сделать это, но поправьте меня, если я ошибаюсь.
Я не уверен, что с этим делать! Мне нужно indata.available (), чтобы вернуть 0, если я не записал объект в поток.
private InputStream[] indata;
private ObjectInputStream[] inputs;
private ObjectOutputStream[] outputs;
private int[] stamps;
// Establish connections via sockets between 3 hosts, serverless
while (true) {
// Build a message
for (all hosts that aren't myself) {
if ( i != rank ) {
outputs[i].writeObject( message );
outputs[i].writeObject( stamps );
outputs[i].flush( );
outputs[i].reset( );
}
}
// Read a message in from a host that sent one
for (all hosts that aren't myself) {
if (indata[j].available() > 0) {
String message = (String)inputs[j].readObject();
int[] senderStamps = (int[])inputs[j].readObject();
}
}
}
Некоторая дополнительная информация, для уточнения:
Я использую available (), потому что инструктор использовал его в своем коде, и мне не разрешено его менять. Кроме того, вызов функции available () работал так, как предполагалось, когда отправлялся только один объект (строка) - единственным кодом, который был на стороне отправки, были «writeObject» и «flush». Моя работа состояла в том, чтобы добавить код для отправки массива, и когда я делаю это, я также должен добавить код для сброса () ObjectOutputStream (или у меня возникают другие проблемы - когда массив отправляется, изменяется, а затем отправляется снова без вызова метода reset () между отправками вместо новой измененной отправляется исходная, неизмененная версия).
Я не могу просто заблокировать чтение, так как процесс, заблокированный на чтение, не может записывать на другие хосты, и мне нужно иметь возможность писать, даже если хосту нечего читать.
Кроме того, нам не разрешено использовать несколько потоков.