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