这似乎是最明显的事情,但我无法弄清楚如何使用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。
我能想到的另一种方法是在发送数据之前发送数据的大小,但这似乎是很长的一段时间。
答案 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
上发送一个简单的字符串,那么您可以使用简单的StreamWriter
和Write(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();
}
这完全取决于您需要阅读的内容以及您使用的流的类型。这里的方法你可以在读取结果的同时添加一个计数,如果你真的需要的话。
只需跟踪操作过程中读取的字符数,即可获得大小和数据。