Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ObjectOutputStream и ObjectInputStream и UDP / 7 сообщений из 7, страница 1 из 1
10.01.2012, 18:33:54
    #37608058
testjava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream и ObjectInputStream и UDP
Задача, такая: нужно принять по UDP пакеты на два сокета и передать их в другой(общий) поток. Выбрал следующий путь: принимаю пакеты-получаю объекты-и сериализую их в общий поток! Для передачи в общий поток использую PipedOutputStream и PipedInputStream. Для сериализации ObjectOutputStream и ObjectInputStream. Но возникла проблема, когда кидаю из двух сокетов в один поток java.io.OptionalDataException. Вопрос, как мне лучше разделить объекты в ObjectInputStream, передаваемые в один поток и возможно ли это вообще? Для одного сокета все работает!
...
Рейтинг: 0 / 0
10.01.2012, 18:40:30
    #37608075
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream и ObjectInputStream и UDP
Зависит от того что это за "другой(общий) поток" ? Варианта, собственно, только два. Либо сериализовать (выстравивать передачу данных строго по очереди), либо рапараллеливать.
Для сериализации можно выделить отдельный Thread для записи в PipedOutputStream. Метод записи сделать synchronized.
Но это может стать узким местом, т.к. все входящие запросы будут ждать записи друг друга.
...
Рейтинг: 0 / 0
10.01.2012, 18:46:07
    #37608080
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream и ObjectInputStream и UDP
О! Так если объекты серализованные. Может из через concurent коллекцию писать? Сразу будет и очередь и синхронизация.
Т.е. заводим BlockingQueue и отдельный Thread. Thread тупо в цикле читает из этой очереди и отправляет объекты на выход.
А прёмник из сокетов - многопоточный и просто пишет объекты в коллекцию. Так будет и очередь и сериализация данных.
...
Рейтинг: 0 / 0
10.01.2012, 18:46:55
    #37608083
testjava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream и ObjectInputStream и UDP
Спасибо! забыл указать, что сокеты находятся в разных потоках, они принимают пакет, создают объект и сериализуют его в PipedOutputStream, причем эти два потока используют один и тот же PipedOutputStream. А в третьем потоке принимаю в PipedInputStream и пытаюсь его обработать!
...
Рейтинг: 0 / 0
10.01.2012, 18:48:06
    #37608086
testjava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream и ObjectInputStream и UDP
Спасибо! забыл указать, что сокеты находятся в разных потоках, они принимают пакет, создают объект и сериализуют его в PipedOutputStream, причем эти два потока используют один и тот же PipedOutputStream. А в третьем потоке принимаю в PipedInputStream и пытаюсь его обработать! Как я понял вы предлагаете каждому сокету передать поток который и будет синхронизовано кидать сериализованные объекты в PipedOutputStream?
...
Рейтинг: 0 / 0
10.01.2012, 18:51:08
    #37608088
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream и ObjectInputStream и UDP
testjavaКак я понял вы предлагаете каждому сокету передать поток который и будет синхронизовано кидать сериализованные объекты в PipedOutputStream?
У сокетов свои потоки, их задача считать данные и как можно раньше от них избавится, чтобы не быть узким местом.
Эти данные помещаются в очередь. Это очень быстрая операция.
Отдельный поток читает из очереди. Когда очередь пустая он блокируется. Как только появляется новый пакет, он просыпается и обрабатывает его.
...
Рейтинг: 0 / 0
10.01.2012, 19:04:27
    #37608109
testjava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream и ObjectInputStream и UDP
BlazkowiczЭти данные помещаются в очередь. Это очень быстрая операция.
Отдельный поток читает из очереди. Так! В потоке каждого сокета храним очередь?!! А отдельный поток будет читать эти очереди??!! Тогда вопрос каким образом оптимальнее(быстрее) проводить эту пердачу? Я вот передаю так: private void messageToObjectOutput(Message mes) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(pout);
synchronized(mes) {
oos.writeObject(mes);
oos.flush();
pout.flush();
}
}
pout это PipedOutputStream

а принимаю : ObjectInputStream ois = new ObjectInputStream(pin);
Message mes = (Message)ois.readObject(); pin PipedInputStream
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ObjectOutputStream и ObjectInputStream и UDP / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]