Программа иногда висит при отправке больших объектов через розетки [закрыто]JAVA

Программисты JAVA общаются здесь
Anonymous
Программа иногда висит при отправке больших объектов через розетки [закрыто]

Сообщение Anonymous »

У меня есть довольно сбивающая с толку проблема, в которой у меня есть розетка, соединяющая две стороны с объектно -аудитористом и объектно -объект, и эти стороны должны обмениваться несколькими большими объектами или массивами объектов друг с другом. Однако иногда он висит в функции, которая выглядит похожей на это: < /p>
Object[] sendData(Object largeObject, Object[] arrayOfBigThings,
ObjectInputStream in, ObjectOutputStream out) throws IOException, ClassNotFoundException {
Object[] toReturn = new Object[2];
out.writeObject(largeObject);
out.flush();
toReturn[0] = in.readObject();
out.writeObject(arrayOfBigThings);
out.flush();
toReturn[1] = in.readObject();
return toReturn;
}
< /code>
Обе стороны называют эту функцию для обмена своими объектами. [Редактировать: Чтобы уточнить, обе стороны выполняют эту функцию одновременно, чтобы обменять свои большие объекты. Это код, который запускаются обе стороны.] Я измерил связь, и он колеблется от 2 до 10 МБ, когда я заменяю разъем на файл (с соответствующей перестройкой вызовов). < /P>
Я попробовал несколько вариантов, например, добавление. Reset () после вызовов in.readObject (). Когда он висит, и я заканчиваю один из процессов, он всегда перечисляет одну из двух вызовов Out.writeObject в качестве источника прерванного исключения подключения. Они используют один и тот же порт каждый раз. Программа работает на одном компьютере, поэтому IP - 127.0.0.1. < /P>
Изменить: благодаря пользователю Duncg, я изменил свою программу, чтобы выглядеть аналогично тем, что ниже, что решило проблему: < /p>
Object[] sendData(Object largeObject, Object[] arrayOfBigThings,
ObjectInputStream in, ObjectOutputStream out) throws IOException, ClassNotFoundException {
Object[] toReturn = new Object[2];
ThreadData data = new ThreadData(in);
Thread dataThread = new Thread(data);
dataThread.start();
out.writeObject(largeObject);
out.flush();
out.writeObject(arrayOfBigThings);
out.flush();
dataThread.join();
toReturn[0] = data.object0;
toReturn[1] = data.object1;
return toReturn;
}
private class ThreadData implements Runnable{
ObjectInputStream in;
public Object object0;
public Object object1;

@Override
public void run() {
try {
object0 = in.readObject();
object1 = in.readObject();
} catch(Exception e) {
System.exit(1); //Should be replaced with a mechanism to gracefully close program.
}
}
}
< /code>
Проблема в том, что у меня не было in.readobject (), когда вызов out.writeObject () был запущен на обеих сторонах, что означает, что я заполнял буфер или какой -то подобный механизм где -то. Их предложением состояло в том, чтобы поместить вызовы in.readObject () в отдельный поток, который полностью решил проблему. Я хотел бы заслужить их за ответ.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... gh-sockets

Вернуться в «JAVA»