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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправить 1 через SocketChannel 
:(
    Опции темы
neiron
Дата 19.8.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Совсем моя замучился. 

В общем, есть реализация одной тулзы на многопотоковой сокетной архитектуре. Всё работает. Надо переписать на NIO.
Вот небольшой кусочек, осуществляющий, сопсно IO:

Код

DataInputStream dis = new DataInputStream(moduleSocket.getInputStream());
            DataOutputStream dos = new DataOutputStream(moduleSocket.getOutputStream());
            
            String imei = dis.readUTF();
            dos.writeBoolean(true);
            
            while (true) {
                byte[] packet = ByteWrapper.unwrapFromStream(dis);
                
                if (packet == null) {
                    System.out.println("Closing connection: " + moduleSocket);
                    break;
                }
                
                AvlData decoder = null;
                if (packet[0] == AvlData.getCodec().getCodecId()) {
                    decoder = AvlData.getCodec();
                } else {
                    System.out.println("Unknown packet format");
                }
                
                AvlData[] decoded = decoder.decode(packet);
                
                                                                dos.writeInt(decoded.length);
            }


Интересующие строки - 4,5, 8, 24

Входной поток увязал:
Код

buffer.clear();
            int re = IOsc.read( buffer );
            buffer.flip();
            //читаем 
            byte[] strCh = new byte[re];
            buffer.get(strCh);            
            ByteArrayInputStream bbis = new ByteArrayInputStream(strCh);            
            dis = new DataInputStream(bbis);

Т.е. перекидываю пришедшее инфо с сокетченелла в байтовый поток, с которым и продолжаю работать. Вроде бы всё ок. 
А вот выходной поток заюзать никак не могу. В первом блоке кода в строке 4 юзается writeBoolean(true), которая, сопсно, сводится к OutputStream.write((int) 1), т.е. отправляется интовая 1.
Вопрос: что мне нужно написать в скобочках:
Код

IOsc.write();


Iosc - SocketChannel. Понятно, что там надо указать ByteBuffer. Вот только каким он должен быть? 
Юзал так:
Код

private boolean processOutput(int num) throws IOException{
    ByteBuffer outbuffer = ByteBuffer.allocate(8);    
    outbuffer.clear();    
    //outbuffer.put((byte) 0);
    outbuffer.put((byte) num);    
    outbuffer.flip();    
    IOsc.write(outbuffer);
    return true;
    }
}


с коменченной и некоменченной строкой 4. 
Т.е. либо 1, либо 01.
Нет, устройство не отвечает. 

Это сообщение отредактировал(а) neiron - 19.8.2008, 08:43
PM MAIL   Вверх
Ortega
Дата 19.8.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 5.11.2005
Где: Харьков, Украина

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



Возможно, мой вопрос будет глупым....
dos.flush() не пробовал?
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
neiron
Дата 19.8.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а в каком месте мне его пробовать? 
В старой версии (1й листинг) юзался этот dos, который, по сути есть OutputStream сокета. 

Теперь я не работаю с сокетом напрямую. Он обёрнут в SocketChannel. Чэннел этот имеет метод write(ByteBuffer). Т.е. этот буфер должен содержать интовую единичку. Обнаружил я и метод нужный и у буффера:
ByteBuffer.putInt(int)
Т.е., в буфер толкаем интовую единичку. Отсылаю - нет ответа от клиента. 

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

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

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


 




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


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

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