2013-05-13 4 views
0

Я пытаюсь отправить строку Base64 скриншота на сервер через NetworkStream и, кажется, я получаю полную строку, проблема это омлет ...StreamReader.Read текст из строя

I предположим, что это имеет какое-то отношение к тому, что оно фрагментировано и объединяется? Что бы надлежащим образом идти об этом ...

код клиента

byte[] ImageBytes = Generics.Imaging.ImageToByte(Generics.Imaging.Get_ScreenShot_In_Bitmap()); 
string StreamData = "REMOTEDATA|***|" + Convert.ToBase64String(ImageBytes); 
SW.WriteLine(StreamData); 
SW.Flush(); 

код сервера

char[] ByteData = new char[350208]; 
SR.Read(ByteData, 0, 350208); 
string Data = new string(ByteData); 
File.WriteAllText("C:\\RecievedText", Data); 

Также размер отправленного сообщения и массив символов точно так же, . \

EDIT: После беспорядка с ним еще немного я понял, что текст не скремблирован, но правильный текст - это tra iling предыдущего потока. Как я могу убедиться, что поток очищен или получает весь текст?

+1

Первая проблема: вы вызываете 'SR.Read', но игнорируете возвращаемое значение. Зачем? Я очень * очень сомневаюсь, что это действительно «скремблировано» - я подозреваю, что вы неправильно изучаете проблему, если честно ... но вы не предоставили нам достаточно данных для продолжения. –

+0

Просто для удовольствия попробуйте помещать StreamWriter в блок 'using'. –

+0

@Jon Все, что я делаю в данный момент, сразу записывает буфер в текстовый файл для сравнения выходов. Текст writtentext полностью скремблирован и не соответствует порядку по сравнению с оригинальным отправленным текстом – user2379231

ответ

0

Возможно, вы не читали весь предыдущий ответ. Вы должны прочитать в цикле, пока вы не получите никаких данных, как это:

char[] ByteData = new char[350208]; 
int totalChars = 0; 
int charsRead; 
while ((charsRead = SR.Read(ByteData, totalChars, ByteData.Length - totalChars) != 0) 
{ 
    totalChars += charsRead; 
} 
string Data = new string(ByteData, 0, totalChars); 
File.WriteAllText("C:\\RecievedText", Data); 

Ключевым моментом здесь является то, что StreamReader.Read читает до максимальное количество символов, которые вы рассказали об этом. Если не так много персонажей, доступных сразу, он будет читать то, что доступно, и вернуть их. Возвращаемое значение сообщает вам, сколько он читает. Вы должны продолжать читать, пока не получите количество символов, которое хотите, или пока Read не вернет 0.

+0

Не повезло. Всегда есть количество байтов, которые я указал, поэтому я не думаю, что это связано с тем, что этого недостаточно. Однако я ценю понимание. – user2379231

+0

@ user2379231: Дело в том, что там * нет * всегда достаточно. Данные отправляются в относительно небольших пакетах от клиента к серверу. Таким образом, с вашим кодом сервер будет читать один пакет и сказать «Ну, я закончил», прежде чем клиент сможет отправить другой пакет. Вы должны записать возвращаемое значение из своего вызова в 'SR.Read' и вывести его каким-то образом. Я думаю, вы будете удивлены. –

+0

Я даже не знал, что прочитал возвращаемое значение, посмотрев на msdn, я вижу, что он возвращает символы, которые читаются. Я немного поиграю с этим! – user2379231

Смежные вопросы