Как получить поток из StreamSocket

Я разрабатываю приложение Metro Client-Server и в клиенте использую StreamSocket для подключения к слушающему серверу. Затем я пытаюсь использовать StreamWriter для отправки данных на сервер. Проблема в том, что когда я создаю новый объект StreamWriter, мне нужно передать ему аргумент потока. В моем случае мне нужно передать ему поток из StreamSocket. Вот о чем я говорю:

   private StreamWriter swSender;


   private StreamSocket tcpServer;

При попытке отправить данные:

   swSender = new StreamWriter(????);
   swSender.WriteLine(mytext);
   swSender.Flush();

???? должен быть потоком из tcpServer, но нет метода GetStream(), как в классе TcpClient() из более старой структуры. Любые обходные пути? Есть идеи? Заранее спасибо.


person Dimitar Gyurov    schedule 26.04.2012    source источник


Ответы (2)


Если я не ошибаюсь, у него есть InputStream и OutputStream.

а потом

async private void WaitForData(StreamSocket socket)
{
 var dr = new DataReader(socket.InputStream);
 //dr.InputStreamOptions = InputStreamOptions.Partial;
 var stringHeader = await dr.LoadAsync(4);
 if (stringHeader == 0)
 {
    // disconnected
    return;
 }

 int strLength = dr.ReadInt32();
 uint numStrBytes = await dr.LoadAsync((uint)strLength);
 string msg = dr.ReadString(numStrBytes);
 WaitForData(socket);
}

ИЗМЕНИТЬ

Итак, вам нужно что-то вроде этого

IBuffer buffer = CryptographicBuffer.ConvertStringToBinary(text,   BinaryStringEncoding.Utf8);
tcpServer.OutputStream.WriteAsync(buffer);
person Likurg    schedule 26.04.2012
comment
Спасибо за ответ, но в вашем коде вы ждете ответа от сервера, а затем клиент получает сообщение от сервера. Мой вопрос больше связан со случаем, когда клиент отправляет информацию на сервер. Вот почему я пытаюсь использовать StreamWriter. - person Dimitar Gyurov; 27.04.2012
comment
dr.ReadInt32() возвращает огромное число и попадает в OutOfMemoryException - person MLProgrammer-CiM; 11.12.2012
comment
@EfEs, что ты пытался сделать? - person Likurg; 11.12.2012
comment
Откуда вы взяли «OutOfMemoryException»? в «LoadAsync»? почему вы не использовали «пока»? - person Likurg; 11.12.2012
comment
Нет, в строке msg = dr.ReadString(numStrBytes) число байтов для чтения было слишком большим, например, 80 миллионов. - person MLProgrammer-CiM; 12.12.2012
comment
Моим решением было reader.InputStreamOptions = InputStreamOptions.Partial; ждать читателя.LoadAsync(BUFFER_LENGTH); строка msg = reader.ReadString(reader.UnconsumedBufferLength); - person MLProgrammer-CiM; 12.12.2012
comment
@EfEs Так что это сбой вашей памяти, а не программы. Кстати, мой второй комментарий к вам - это то же самое, что и ваше решение. Пожалуйста, удалите минус. - person Likurg; 12.12.2012

Вы можете использовать что-то вроде этого (для правильной утилизации)

Запуск потокового чтения и записи для tcpclient

person vincent strobbe    schedule 11.11.2018