powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / DataInputStream, DataOutputStream в с++
23 сообщений из 23, страница 1 из 1
DataInputStream, DataOutputStream в с++
    #38379977
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть что-то похожее для с++?
или вопрос так можно поставить: как в с++ клиенте сделать стрим, который будет работать с DataInputStream, DataOutputStream
в Java сервер приложении?
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38379993
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятно, что значит "работать с DataInputStream, DataOutputStream".
Если вы имеете ввиду, работа с объектами такого типа из С++ через JNI, то читайте туториалы по JNI.
Если вам надо уметь создать набор байт, которые сможет понять Java приложение, или наоборот - распарсить бинарные сериализованные данные из Java, то читайте про то, в каком формате сериализуются объекты.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38379996
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh,

protobuf первое что приходит на ум
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380005
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach Непонятно , что значит "работать с DataInputStream, DataOutputStream".
Если вы имеете ввиду, работа с объектами такого типа из С++ через JNI, то читайте туториалы по JNI.
Если вам надо уметь создать набор байт, которые сможет понять Java приложение, или наоборот - распарсить бинарные сериализованные данные из Java, то читайте про то, в каком формате сериализуются объекты.

как в с++ клиенте сделать стрим, который будет работать с DataInputStream, DataOutputStream
в Java сервер приложении
?


т.е. в как в с++ клиенте коннектиться и передавать, получать стрим с сервера на Java, использующего DataInputStream, DataOutputStream.
Предположим мне надо из с++ передать стримом файл.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380008
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DataInputStream и DataOutputStream это бесполезные устаревшие классы. Посмотрите их исходный код. Он примитивен. Реализовать подобное на С++ не будет проблемой. Но лучше используйте протоколы, которые поддерживаются разными платформами. Вышеупомянутый protobuf, SOAP, hessian и т.п.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380014
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczDataInputStream и DataOutputStream это бесполезные устаревшие классы. Посмотрите их исходный код. Он примитивен. Реализовать подобное на С++ не будет проблемой. Но лучше используйте протоколы, которые поддерживаются разными платформами. Вышеупомянутый protobuf, SOAP, hessian и т.п.

хых.... проблема в том, что сервер на Java со стримами есть, и надо попробовать коннектнуться к нему из с++.
Да, там несложный класс, но он тянет за собой еще ккие-то... я думал может уже люди что-то подобное сочинили
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380021
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы некорректно воспринимаете проблему. Если вам надо добиться коммуникации между Java приложением и C++ приложением, то вам необходимо:
1) Определиться со способом коммуникации. Сокеты, shared memory, файлы, и т.д.
2) Определиться с протоколом. Бинарный, текстовый, и т.д.

Data(Input|Output)Stream'ы - это просто обертки. Они не определяют способы коммуникации процессов, и не определяют протокол. Например, один объект может сериеализоваться через классический джавовский протокол Serializable, другой через кастомный протокол Externalizable, а для третьего вообще написан свой кастомный маршаллер, который транспарентно заменяет собой джавовский Serializable. И с точки зрения кода все они смогут работать через Data(Input|Output)Stream.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380025
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

Вы часом Object и Data Stream не попутали? Object*Stream - отвечает за сериазирацию. Data*Stream простейшая обертка над *Stream для записи примитивных типов.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380045
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczDEVcoach,
Вы часом Object и Data Stream не попутали? Object*Stream - отвечает за сериазирацию. Data*Stream простейшая обертка над *Stream для записи примитивных типов.Верно, читай одно, думаю о другом.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380046
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhхых.... проблема в том, что сервер на Java со стримами есть, и надо попробовать коннектнуться к нему из с++.
Да, там несложный класс, но он тянет за собой еще ккие-то... я думал может уже люди что-то подобное сочинили

На самом деле Data*Stream даже не предоставляет протокола. Т.е. пакеты вам все равно надо будет собирать схожим кодом в Java и C++. Data*Stream всего лишь предоставляет способ чтения\записи примитивов. Аналогичные методы для аналогичных примитивов пишутся на С++ за пару часов.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38380086
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhкак в с++ клиенте сделать стрим, который будет работать с DataInputStream, DataOutputStream в Java сервер приложении?Если не ошибаюсь, то там разница всего лишь в порядке передаваемых байтов .
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381254
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanWinnipuhкак в с++ клиенте сделать стрим, который будет работать с DataInputStream, DataOutputStream в Java сервер приложении?Если не ошибаюсь, то там разница всего лишь в порядке передаваемых байтов .



да, я взял thrift, пишу так из с++

// MAGIC = 0xCA552DFA

protocol->writeI32(ms->MAGIC);




в Java сервер приходит, читаются 4 байта,

public final int readInt() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}

и на выходе получается целое = 4, вместо нужного..

в чем причина?
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381361
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhв чем причина?Получается, что Вы считываете 4 раза по 4 байта. Исправьте и попробуйте заново:
Код: java
1.
2.
3.
4.
5.
int ch1 = in.readByte();
int ch2 = in.readByte();
int ch3 = in.readByte();
int ch4 = in.readByte();
...
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381391
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanWinnipuhв чем причина?Получается, что Вы считываете 4 раза по 4 байта. Исправьте и попробуйте заново:
Код: java
1.
2.
3.
4.
5.
int ch1 = in.readByte();
int ch2 = in.readByte();
int ch3 = in.readByte();
int ch4 = in.readByte();
...



на стороне сервера в Java я не могу исправить? только на клиенте.

Но что интересно: взял утилиту Hercules (www.hw-group.com), сделал коннект, далее сделал send (hex) и всунул то шестнадцатеричное число - сервер нормально распознал
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381471
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh,

Попробуйте отправить с клиента таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
typedef union {
	int magic;
	unsigned char bytes[sizeof(int)];
} MAGIC_BYTES, *PMAGIC_BYTES;
MAGIC_BYTES mb;
mb.magic = 0xCA552DFA;
//cout << hex << (int)mb.bytes[0] << endl;
//cout << hex << (int)mb.bytes[1] << endl;
//cout << hex << (int)mb.bytes[2] << endl;
//cout << hex << (int)mb.bytes[3] << endl;
protocol->writeI32((int)mb.bytes[0]);
protocol->writeI32((int)mb.bytes[1]);
protocol->writeI32((int)mb.bytes[2]);
protocol->writeI32((int)mb.bytes[3]); // BIG-ENDIAN
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381504
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь прочитанное целое = 16

еще раз, вот так оно читается в Java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
    }
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381506
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczDataInputStream и DataOutputStream это бесполезные устаревшие классы. Посмотрите их исходный код. Он примитивен. Реализовать подобное на С++ не будет проблемой. Но лучше используйте протоколы, которые поддерживаются разными платформами. Вышеупомянутый protobuf, SOAP, hessian и т.п.
Тем не менее он нигде не deprecated если смотреть с точки зрения документации производителя.

http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381520
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТем не менее он нигде не deprecated если смотреть с точки зрения документации производителя.

Не аргумент. В JSE классы вообще редко объявляются deprecated. Тем неменее там всё ещё полно редкого хлама с пометкой since JDK 1.0.
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381526
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanWinnipuh,

Попробуйте отправить с клиента таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
typedef union {
	int magic;
	unsigned char bytes[sizeof(int)];
} MAGIC_BYTES, *PMAGIC_BYTES;
MAGIC_BYTES mb;
mb.magic = 0xCA552DFA;
//cout << hex << (int)mb.bytes[0] << endl;
//cout << hex << (int)mb.bytes[1] << endl;
//cout << hex << (int)mb.bytes[2] << endl;
//cout << hex << (int)mb.bytes[3] << endl;
protocol->writeI32((int)mb.bytes[0]);
protocol->writeI32((int)mb.bytes[1]);
protocol->writeI32((int)mb.bytes[2]);
protocol->writeI32((int)mb.bytes[3]); // BIG-ENDIAN




сделал так:

занес код чтения прямо в код сервера, чтобы можно было отладить.

Вот что имеем:
шлю из с++

protocol->writeI32(mb.magic);

получаю в Java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 int ch1 = in.read();       // 0
 int ch2 = in.read();       // 0
 int ch3 = in.read();       // 0
 int ch4 = in.read();       // 4
 if ((ch1 | ch2 | ch3 | ch4) < 0)
        throw new EOFException();

int nMagic = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));

//nMagic = 4 



может это 4 - длина в байтах, которые отправлены?
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381536
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, сначала идет длина в байтах, а ее не должно быть на чтении, сервер не предполагает, что длина передается перед данными.

То ли thrift добавляет, то ли х.е.з...
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381615
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhТо ли thrift добавляет, то ли х.е.з...А на сервере тоже стоит thrift ?
Описание функции writeI32Write an i32 as a zigzag ( O_o ) varint. P.S.
Очень насторожило слово zigzag
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381772
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanWinnipuhТо ли thrift добавляет, то ли х.е.з...А на сервере тоже стоит thrift ?
Описание функции writeI32Write an i32 as a zigzag ( O_o ) varint. P.S.
Очень насторожило слово zigzag

там есть он, но в данном случае не используется.
Я решил проблему, TFramedTransport к каждому фрейму добавляет длину. Заменимл его на TBufferedTransport - всё гут.

Но остался вопрос:

Хотелось бы упаковать заголовок сообщения, в котором несколько целых, далее массив байтов внутри - в массив байтов и отправить на сервер.

Как передать массив байтов в thrift?
...
Рейтинг: 0 / 0
DataInputStream, DataOutputStream в с++
    #38381906
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhКак передать массив байтов в thrift?Никак. Серверная часть вашего приложения пока не приспособлено к этому.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / DataInputStream, DataOutputStream в с++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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