Dalerico Ответов: 2

Как перехватить поток памяти (C#) по проводу, идущему в java inputstreamarray


У меня есть служба wcf rest, в которой я создал MemoryStream для одного из моих операционных контрактов, который имеет объект, инкапсулирующий множество свойств. Это HTTP-запрос GET для передачи данных клиенту (приложение Android music).

Я написал некоторый код, чтобы взять мой служебный MemoryStream в приложение на основе java, но я не совсем уверен, как я должен управлять преобразованием MemoryStream в InputStreamArray. Двух разных языков программирования (C# &амп; Ява). Кто-нибудь может помочь с каким-нибудь примером кода. Я опубликую свою кодовую базу, если кто-то захочет ее увидеть, но это довольно сложно-попытаться организовать ее здесь и сделать хорошим смыслом для других.

Ниже приведен вывод моего сообщения wcf, которое является envolope в формате JSON. Любая помощь будет очень оценена. Спасибо!

Вот мой формат wcf web servie JSON перед обработкой моего универсального объекта списка в поток памяти.

LoadTracksByAlbumResult: [{AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg",…},…]
2.	0: {AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg",…}
1.	AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg"
2.	AlbumID: 2135
3.	AlbumName: "Sauce Walka - The Sauce Father"
4.	Artists: "(Sauce Walka . )"
5.	CreatedBy: 0
6.	CreatedOn: "6/5/2017"
7.	DiscJockeyName: "(No DJ. )"
8.	DjID: 23
9.	DownloadStatus: false
10.	TotalStreams: "1039"
11.	TrackDescription: "Description 1"
12.	TrackID: 35094
13.	TrackStatus: true
14.	TrackTitle: "01-Sauce_Walka-We_Did_It"
15.	TrackUrl: "/UploadContents/AlbumTracks/2135/01-Sauce_Walka-We_Did_It.mp3"
16.	UpdatedBy: 0
17.	UpdatedOn: ""
3.	1: {AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg",…}
4.	2: {AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg",…}
5.	3: {AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg",…}
6.	4: {AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg",…}
7.	5: {AlbumCoverPhotoUrl: "/UploadContents/AlbumCoverPhoto/2135/Sauce Walka - The Sauce Father.jpg",…}


А вот ниже приведен мой формат wcf web servie JSON, завернутый в поток памяти.

Что я уже пробовал:

{LoadTracksByAlbumResult: {__identity: null,…}}
	LoadTracksByAlbumResult: {__identity: null,…}
1.	__identity: null
2.	_buffer: [91, 123, 34, 84, 114, 97, 99, 107, 73, 68, 34, 58, 51, 53, 48, 57, 52, 44, 34, 84, 114, 97, 99, 107,…]
3.	_capacity: 7522
4.	_expandable: false
5.	_exposable: false
6.	_isOpen: true
7.	_length: 7522
8.	_origin: 0
9.	_position: 0
10.	_writable: true


Частичный код с серверной стороны потока памяти ниже. Подготавливает объект данных для передачи по проводу.


Реализация функции ниже:



byte[] byteArray = new byte[4000];

           // Convert the data Object (generic list) to be serialized and return a JSON string.
           var json1 = new JavaScriptSerializer().Serialize(loadAlbumTracksList1);

           // Convert the string into bytes of array.
           byteArray = Encoding.UTF8.GetBytes(json1);

           //public override bool
           MemoryStream stream = new MemoryStream(byteArray);
           //stream.GetBuffer();

           return stream;


Клиентская сторона java: потребление для кусков данных, так что производительность хороша для прослушивания mp3-файлов с сервера. Это частичный код ниже.

Строковый ответственный параметр-это место, куда вводится поток памяти после того, как он проходит через основную сеть (url, имя хоста, конечная точка, порт # и т. д. здесь обрабатываются) приложения. Ниже приведена дополнительная сеть только для потокового процесса, хотя я написал код для приема 2 других вызовов веб-службы wcf, которые поступают с буферизованного сервера. Не могли бы вы помочь? Я знаю, что получаю сообщение об ошибке, говорящее, что кодировка не может быть отображена.

public String getStream(String responseBody) {
        String result = "";
        InputStream inputStream = null;

        try {
            /*
             * Encodes this {@code String} into a sequence of bytes using the
             * platform's default charset, storing the result into a new byte array.
             */
            inputStream = new ByteArrayInputStream(responseBody.getBytes(), 0, 0);

            result = convertInputStreamToString(inputStream);

        }
        catch(Exception ex)
        {
            Log.e("Exception",ex.getLocalizedMessage());
        }
        finally{
            if(inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }


private static String convertInputStreamToString(InputStream inputStream) throws IOException {

        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream) );
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)// Reads characters into a portion of an array.
            result += line;

        inputStream.close();
        return result;

    }


@Override
    public void onRequestSuccess(String responseBody, String type) {
        // Call the getStream function to convert streamToString
        NetworkClient streamProcess = new NetworkClient();

        String streamResponse = streamProcess.getStream(responseBody);
        JSONObject obj = CommonServices.stringToJSON(streamResponse);
        if(obj != null){
            switch (type) {
                case "loadtrack":
                    loadGridFromSavedJSONData(obj);

2 Ответов

Рейтинг:
1

phil.o

Один MemoryStream это просто поток, то есть список байтовых значений. Вы должны отправить массив байтов по проводу (либо непосредственно путем записи из потока памяти в сетевой поток, либо путем кодирования его, например в Base64, и отправить закодированное значение вместо этого). Затем в принимающем приложении java вы либо непосредственно считываете сетевой поток, либо декодируете сообщение Base64 в исходные значения массива байтов.

WCF: большие данные и потоковая передача[^]
Java 8 - Streams - Tutorialspoint[^]


Dalerico

Thank you very much sir for your response. I pretty much I believe have done exactly what you mentioned in your post, but I'm having issues decoding the UTF-8 (Base64) back into characters. It's really strange to me that I have 2 additional wcf services (buffered type) requests come through this same entry point and they were encoded and decoded with no issues. I've tried so many different senarios, I can't even decode the buffered data through stream network part of my application. I should of saved the orginal code, because it also attempted to decode the stream as well, but failed to keep the data decoded. Can you look at code snipplet of mines where the stream is coming into the functioning and basically being converting from a string (memoryStream wrapped into a json format) and passed into a inputStreamArray constructor, to be process for decoding?

phil.o

Пожалуйста, используйте зеленый цвет Улучшить вопрос виджет, который появляется при наведении курсора на ваш вопрос, и добавьте фрагменты, которые имеют дело с кодированием и декондированием частей. Пожалуйста, не пишите свой блок кода в комментарии; комментарии не предназначены для правильного отображения блоков кода.

Рейтинг:
0

Dalerico

Частичный код (c#) со стороны сервера: подготовка объекта данных к передаче по проводу

byte[] byteArray = new byte[4000];

           // Convert the data Object (generic list) to be serialized and return a JSON string.
           var json1 = new JavaScriptSerializer().Serialize(loadAlbumTracksList1);

           // Convert the string into bytes of array.
           byteArray = Encoding.UTF8.GetBytes(json1);

           //public override bool
           MemoryStream stream = new MemoryStream(byteArray);
           //stream.GetBuffer();

           return stream;


Клиентская сторона java: потребление для кусков данных, так что производительность хороша для прослушивания mp3-файлов с сервера. Это частичный код ниже.

Строковый ответственный параметр-это место, куда вводится поток памяти после того, как он проходит через основную сеть (url, имя хоста, конечная точка, порт # и т. д. здесь обрабатываются) приложения. Ниже приведена дополнительная сеть только для потокового процесса, хотя я написал код для приема 2 других вызовов веб-службы wcf, которые поступают с буферизованного сервера. Не могли бы вы помочь? Я знаю, что получаю сообщение об ошибке, говорящее, что кодировка не может быть отображена.

public String getStream(String responseBody) {
        String result = "";
        InputStream inputStream = null;

        try {
            /*
             * Encodes this {@code String} into a sequence of bytes using the
             * platform's default charset, storing the result into a new byte array.
             */
            inputStream = new ByteArrayInputStream(responseBody.getBytes(), 0, 0);

            result = convertInputStreamToString(inputStream);

        }
        catch(Exception ex)
        {
            Log.e("Exception",ex.getLocalizedMessage());
        }
        finally{
            if(inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }


private static String convertInputStreamToString(InputStream inputStream) throws IOException {

        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream) );
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)// Reads characters into a portion of an array.
            result += line;

        inputStream.close();
        return result;

    }


@Override
    public void onRequestSuccess(String responseBody, String type) {
        // Call the getStream function to convert streamToString
        NetworkClient streamProcess = new NetworkClient();

        String streamResponse = streamProcess.getStream(responseBody);
        JSONObject obj = CommonServices.stringToJSON(streamResponse);
        if(obj != null){
            switch (type) {
                case "loadtrack":
                    loadGridFromSavedJSONData(obj);