Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > клиент+сервер ассинхронные сокеты + await async


Автор: 123456789igor 22.3.2014, 23:32
Привет! Столкнулся с проблемой и пока не могу ее решить, надеюсь на ваши советы. К сути. Есть клиент и сервер основанные на ассинхронных сокетах и ключевых словах 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");
        }

Автор: jonie 24.3.2014, 09:30
когда читаете (клиентом) надо проверять что прочитали сколько надо, ибо http://msdn.microsoft.com/en-us/library/hh137813%28v=vs.110%29.aspx как бэ намекает:
Цитата

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. 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)