Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> клиент+сервер ассинхронные сокеты + await async 
:(
    Опции темы
123456789igor
Дата 22.3.2014, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет! Столкнулся с проблемой и пока не могу ее решить, надеюсь на ваши советы. К сути. Есть клиент и сервер основанные на ассинхронных сокетах и ключевых словах await и async. Проблема следующая я хочу передать картинку от сервера клиенту. Логика такая bitmap->byte[]->char[] и передаю char[] массив ну и на стороне клиента обратно декодирую. Вопрос следующий не могу понять почему при декодировании и итоге часть данных масива "теряется" т.е вручную глянул эл-ты передаваемого и принятого массива и значения в конце массива различны. 
Собственно код: 
Сервер:
Код

CodingImage img = new CodingImage();
                buffer = img.CodingImages("C:\\image\\lol.bmp");
                bufferChar = Encoding.Unicode.GetChars(buffer);
                char lastindex = bufferChar[218726];
                count = bufferChar.Length;
                lenght = bufferChar.Length.ToString();
                LogMessage("Waiting for connections...");
                try
                {
                    var tcpClient = await listener.AcceptTcpClientAsync();
                    HandleConnectionAsync(tcpClient);
                }

Код

private async void HandleConnectionAsync(TcpClient tcpClient)
        {
            string clientInfo = tcpClient.Client.RemoteEndPoint.ToString();
            LogMessage(string.Format("Got connection request from {0}", clientInfo));
            try
            {
                using (var networkStream = tcpClient.GetStream())
                using (var reader = new StreamReader(networkStream))
                using (var writer = new StreamWriter(networkStream))
                {
                    writer.AutoFlush = true;
                    while (true)
                    {
                        //var dataFromServer = await reader.ReadAsync(bufferChar, 0, count);
                        /*if (string.IsNullOrEmpty(dataFromServer.ToString()))
                        {
                            break;
                        }
                        LogMessage(dataFromServer.ToString());
                         */
                        await writer.WriteLineAsync(lenght);
                        await writer.WriteAsync(bufferChar, 0, count);
                    }
                }
            }


Код

public byte[] CodingImages(string path)
        {
            Bitmap picture = new Bitmap(path);
            TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
            byte[] MassOfPicture = (byte[])tc.ConvertTo(picture, typeof(byte[]));
            byte lastindex = MassOfPicture[437453];
            return MassOfPicture;
        }


Клиент
Код

TcpClient client = new TcpClient();
            await client.ConnectAsync(IPAddress.Loopback, port);
            LogMessage("Connected to Server");
            using (var networkStream = client.GetStream())
            using (var writer = new StreamWriter(networkStream))
            using (var reader = new StreamReader(networkStream)) 
            {
                writer.AutoFlush = true;
                for (int i = 0; i < 1; i++)
                {
                    //await writer.WriteLineAsync(DateTime.Now.ToLongDateString());
                    var lenght = await reader.ReadLineAsync();
                    int lenghtInt = Convert.ToInt32(lenght.ToString());
                    recievedChar = new char[lenghtInt];
                    await reader.ReadAsync(recievedChar, 0, lenghtInt);
                    char lastindex = recievedChar[218726];
                    EncodingImage img = new EncodingImage();
                    img.EncodingImages(recievedChar);

                    if (!string.IsNullOrEmpty(lenght))
                    {
                        LogMessage(lenght);
                    }

                }
            }

Код

public void EncodingImages(char[] recievedChar)
        {
            byte[] recieved = Encoding.Unicode.GetBytes(recievedChar);
            byte lastindex = recieved[437453];
            TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
            Bitmap bitmap = (Bitmap)tc.ConvertFrom(recieved);
            bitmap.Save("C:\\image\\lol_recieved.bmp");
        }

PM MAIL   Вверх
jonie
Дата 24.3.2014, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



когда читаете (клиентом) надо проверять что прочитали сколько надо, ибо MSDN как бэ намекает:
Цитата

Return Value
Type: System.Threading.Tasks.Task<Int32>
A task that represents the asynchronous read operation. The value of the TResult parameter contains the total number of bytes read into the buffer. The result value can be less than the number of bytes requested if the number of bytes currently available is less than the requested number, or it can be 0 (zero) if the end of the stream has been reached. 

т.е. читать надо в цикле пока суммарное количество не будет равно нужному вам...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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