получить длину данных, отправленных по сети в TCPlistener / networkstream vb.net - PullRequest
1 голос
/ 08 января 2010

Кажется, это самая очевидная вещь, но я просто не могу понять, как получить длину байтов, отправляемых по сети, с использованием TCPClient и TCPListener? Это мой код:

   'Must listen on correct port- must be same as port client wants to connect on.
    Const portNumber As Integer = 9999
    Dim tcpListener As New TcpListener(IPAddress.Parse("192.168.2.7"), portNumber)

    tcpListener.Start()
    Console.WriteLine("Waiting for connection...")

    'Accept the pending client connection and return 
    'a TcpClient initialized for communication. 
    Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
    Console.WriteLine("Connection accepted.")
    ' Get the stream
    Dim networkStream As NetworkStream = tcpClient.GetStream()
    '' Read the stream into a byte array

Мне нужно получить длину сетевого потока, чтобы установить размер массива байтов, в который я собираюсь читать данные. Но networkStream.length не поддерживается, не работает и выдает исключение Notsupportedex.

Единственный другой способ, который я могу придумать, - это отправить размер данных перед отправкой данных, но, похоже, это далеко.

Ответы [ 2 ]

4 голосов
/ 22 октября 2012

Я понимаю, что этот пост старый, но я чувствую, что есть более простой способ выполнить эту задачу с TcpListener / TcpClient

Вы можете использовать BinaryFormatter для выполнения чтения и записи из NetworkStream, где вы не знаете точную длину.

Использование

System.Runtime.Serialization.Formatters.Binary;

Клиентская сторона

    string[] animals = { "Dog", "Cat", "Mouse" };
    TcpClient c = new TcpClient();
    c.Connect("YourServer", someport);
    using (NetworkStream ns = c.GetStream())
    {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ns, animals);
    }

Сторона сервера

    string[] animals;
    TcpListener l = new TcpListener(IPAddress.Any, someport);
    l.Start();
    TcpClient c = l.AcceptTcpClient();
    using (NetworkStream ns = c.GetStream())
    {
            BinaryFormatter bf = new BinaryFormatter();
            animals = (string[])bs.Deserialize(ns);
    }

Пока вы знаете тип, который вы отправляете и получаете, это способ отправки и получения данных через NetworkStreams без точного подсчета байтов.

Если вы просто отправляете простую строку через NetworkStream, вы можете использовать простой метод StreamWriter и Write(String) для записи в поток, а также StreamReader и метод ReadToEnd() для извлечения ваша строка на другом конце.

Edit: я только думал об этом ответе на днях, и я понимаю, что здесь важно отметить, что для использования BinaryFormatter объект должен быть в состоянии быть сериализованным, отмеченным SerializableAttribute , как в случае некоторых встроенных типов, делает это не вариант. Я прошу прощения за позднее редактирование, но я чувствовал, что это важно отметить.

1 голос
/ 08 января 2010

Не уверен, какой тип объекта вы ожидаете, но это работает, и вы можете отслеживать окончательный размер, извините, но в C #:

System.Net.Sockets.NetworkStream nwStream = objTcp.GetStream();
System.IO.StreamReader stReader = new System.IO.StreamReader(nwStream);

string strTemp = ReadFromBuffer(stReader);

private string ReadFromBuffer(System.IO.StreamReader objReader)
{
        int intRead=1024;
        System.Text.StringBuilder stbBugger = new StringBuilder();
        char[] chrTempBuffer = new char[1024];

        while (intRead == 1024)
        {
            intRead = objReader.Read(chrTempBuffer, 0, 1024);
            stbBugger.Append(chrTempBuffer, 0, intRead);
        }

        return stbBugger.ToString();
    }

Все зависит от того, что вам нужно прочитать и какой тип потока вы используете. Здесь вы можете добавить счетчик при чтении результатов, если вам действительно нужно.

Просто следите за количеством прочитанных символов во время операции, и у вас есть размер плюс данные.

...