Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поллинг сокетов и ObjectInputStream. Как сделать? 
:(
    Опции темы
AlexKozlov
Дата 10.11.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 16.12.2008

Репутация: нет
Всего: 1



Cуть проблемы:
есть куча клиентов, которые по TCPIP цепляются к серверу. Чтобы не мучаться с протоколами сообщений, на клиенте просто цепляем ObjectInput/OutputStream на сокет и радуемся, можно кидать туда-сюда объекты, особо не задумываясь в каком виде они там бегают.

На сервере выходит не все так просто. Делать кучу потоков, каждый на своего клиента нехорошо, нужен поллинг. хочется использовать SocketChannel. Но вот вопрос - что потом делать с этими каналами? Прицепить туда те же ObjectInput/OutputStream не кажется тривиальной задачей, а в результате может получится что очередной вызов readObject вызовет блокировку.

Решение, которое мне пришло в голову:
сделать обертку вокруг ObjectInput/OutputStream и кроме сериализованного объекта передавать его длину. А на приеме естественно первым делом принимаем длину, потом смотрим сколько байтов осталось и если сколько нужно, то только тогда подсовываем его в ObjectInputStream и делаем readObject точно зная что данных хватит и блокировки не будет.

Есть варианты лучше?

Update: упс... а как-то можно эту тему переместить  в работу с сетью?

Это сообщение отредактировал(а) AlexKozlov - 10.11.2011, 17:55
PM MAIL   Вверх
AlexKozlov
Дата 10.11.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 16.12.2008

Репутация: нет
Всего: 1



Вот накидал обертку для ObjectOutputStream. Должен принимать объект и толкать его дальше уже с длиной
Код

public class ObjectWriter {
    OutputStream os;
    PipedInputStream pis=new PipedInputStream();
    PipedOutputStream pos=new PipedOutputStream();
    ObjectOutputStream oos;
    
    ObjectWriter(OutputStream os1) {
        os=os1;
        try {
            pis.connect(pos);
            oos=new ObjectOutputStream(pos);
        } catch (IOException e) { e.printStackTrace(); }
    }
    
    byte[] buffer;
    public void writeObject(Object obj) {
        try {
            oos.writeObject(obj);
            int len=pis.available();
            for (int i=0;i<4;i++) {os.write(len); len>>=8; }
            if ((buffer==null)||(buffer.length<len))
                buffer=new byte[len];
            pis.read(buffer);
            os.write(buffer, 0, len);
            os.flush();
        } catch (IOException e) { e.printStackTrace(); }
    }
    
    public void close() {
        try { oos.close(); } catch (IOException e) { e.printStackTrace(); }
        try { os.close(); } catch (IOException e) { e.printStackTrace(); }
        try { pis.close(); } catch (IOException e) { e.printStackTrace(); }
        try { pos.close(); } catch (IOException e) { e.printStackTrace(); }
    }
}


Это сообщение отредактировал(а) AlexKozlov - 10.11.2011, 18:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.