如何在c#中通过TCP连接发送整数数组

我在两台计算机之间建立了一个TCP连接,用于在Windows应用程序中来回发送和接收数据。 我发送的消息是一组转换为字符串并用“,”拆分的整数。 所以,为了发送我使用的数据,

if (dataSend.Length > 0) { m_writer.WriteLine(dataSend); m_writer.Flush(); } 

其中dataSend是字符串forms的消息,m_writer是StreamWriter。

但是,现在我想通过相同的网络连接将其作为整数数组发送,但我找不到任何东西。 我看到很多人使用字节数组但是我不明白在读取时接收器是如何将字节分成相应的整数的。

我意识到writeline方法也允许Int作为参数,但是如何发送数组呢?
使用字符串很清楚,因为我可以根据“,”分隔数据,因此我知道每个元素的结束位置。 整数数组的分离标准是什么?

如果有人向我解释这一点会很好,因为我对C#的网络方面也很新。

跟进问题: StreamReader不会停止读取C#

您提出的问题几乎总是以某种forms使用序列化和/或数据框架来回答。 IE浏览器。 “我如何通过电线发送一些结构?”

您可能希望使用序列化程序(如XmlSerializer或JSON.NET库)将int[]序列化为字符串。 然后,您可以在另一端反序列化。

 int[] numbers = new [] { 0, 1, 2, 3}; XmlSerializer serializer = new XmlSerializer(typeof(int[])); var myString = serializer.Serialize(numbers); // Send your string over the wire m_writer.WriteLine(myString); m_writer.Flush(); // On the other end, deserialize the data using(var memoryStream = new MemoryStream(data)) { XmlSerializer serializer = new XmlSerializer(typeof(int[])); var numbers = (int[])serializer.Deserialize(memoryStream); } 

好的,你可以使用一个简单的建议

  • 发件人首先发送整数数组的长度。

  • Receiver创建一个数组来接收这些数据

  • 循环中的发件人使用WriteLine()发送数组的每个元素(As string或int)

  • 循环中的接收器使用ReadLine()来捕获每个元素。 并将接收的字符串转换为整数

发件人:

 m_writer.WriteLine(myarray.Length); // Sender sends the array length prior to data transmission // Send all data foreach(int item in myarray){ m_writer.WriteLine(item.ToString()); } 

接收人:

 int Size =Convert.ToInt32( m_reader.ReadLine()); //receiver receives the Length of incoming array int i=0; // Receive all data while(i < Size){ Console.WrilteLine(Convert.ToInt32(m_reader.ReadLine())); // Add this to array i++; } 

我将给你一个答案,假设你想要实际传输字节,以保持协议轻:如果不接受alexw答案,因为它是一个非常好的。

您应该查看某种forms的消息框架 ,或者至少是长度前缀 。 我已经处理TCP套接字协议超过十年了,并且总是使用某种forms(主要是消息帧)。 然而,最近,我一直在使用WCF,并且使用(.NET)序列化,所以我实际上倾向于alexw回答,给定无限带宽(和.NET堆栈是一个共同的架构,或者至少是商定的序列化算法,两边)。

编辑

以下是使用简单长度前缀的方式:

 var myArray = new byte[10]; using (var stream = new MemoryStream()) using (var writer = new BinaryWriter(stream)) { writer.Write(myArray.Length); foreach (var b in myArray) writer.Write(b); } 

当然,使用这种技术,双方都必须参与其中:您在TCP之上建立应用程序级协议,并且双方必须使用相同的语言(例如,知道长度存储在byte,知道我们只发送简单的字节数组,没有进一步的上下文…请参阅消息框架,了解“更多上下文”的外观。

您可以将数据序列化为XML,但不好的是,您最终会为这么简单的数字集创建一个膨胀的字符串。 相反,你应该利用发送原始字节的能力。

要发送整数数组,您将遍历整数数组并将每个整数依次写入流。 使用带整数的Write方法。 但是你还需要向另一方表明要发送多少个整数。 所以首先发送一个数字,它是要跟随的整数计数…

 int[] values = new int[] { 1, 2, 3 }; m_writer.Write(values.Length); foreach(int value in values) m_write.Write(value); 

在接收端,您读取和整数,然后这是您需要读取整数以重新创建数组的次数。

 int count = m_reader.ReadInt32(); int[] values = new byte[count]; for(int i=0; i 

显然我已经跳过任何错误检查,但我把它留给了读者的exersize!

使用Encoding.GetBytes(string)获取Encoding.GetBytes(string)字节数组,使用Encoding.GetString(byte [])转换回字符串。

 byte[] arrBytes = Encoding.Default.GetBytes(dataSend); 

转换回String

 string dataRecieved = Encoding.Default.GetString(arrBytes); 

请注意,您可以使用固定的编码格式,因为发送器和接收器机器上的默认编码可以不同。