1

这似乎是最明显的事情,但我只是不知道如何使用 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。

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

4

2 回答 2

4

我意识到这篇文章很旧,但我觉得有一种更简单的方法来完成这项任务TcpListener/TcpClient

您可以使用BinaryFormatterNetworkStream从您不知道确切长度的地方完成读取和写入。

使用

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 发送和接收数据。

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

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

于 2012-10-22T16:31:47.427 回答
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();
    }

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

只需跟踪操作期间读取的字符数,您就可以得到一个大小加上数据。

于 2010-01-08T16:41:22.127 回答