获取通过网络发送到TCPlistener / networkstream vb.net的数据长度

时间:2010-01-08 16:30:24

标签: .net vb.net byte networkstream

这似乎是最明显的事情,但我无法弄清楚如何使用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不受支持且不起作用并抛出Notsupportedexception。

我能想到的另一种方法是在发送数据之前发送数据的大小,但这似乎是很长的一段时间。

2 个答案:

答案 0 :(得分:4)

我意识到这篇文章已经过时但我觉得有一种更简单的方法可以通过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);
    }

只要您知道发送和接收的类型,就可以在不知道确切字节数的情况下跨NetworkStream发送和接收数据。

如果您只是在NetworkStream上发送一个简单的字符串,那么您可以使用简单的StreamWriterWrite(String)方法写入流并StreamReader以及ReadToEnd()方法在另一端检索字符串。

编辑:前几天我只是在考虑这个答案,我意识到这里需要注意的是,为了使用BinaryFormatter,必须能够通过标记{{{}}来序列化对象。 3}},这是一些内置类型的情况,使这不是一个选项。我为迟到的编辑道歉,但我觉得这很重要。

答案 1 :(得分:1)

不确定您期望的是哪种对象类型,但是这样可以并且您可以跟踪最终大小,抱歉在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();
    }

这完全取决于您需要阅读的内容以及您使用的流的类型。这里的方法你可以在读取结果的同时添加一个计数,如果你真的需要的话。

只需跟踪操作过程中读取的字符数,即可获得大小和数据。