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

时间:2015-02-16 04:59:50

标签: c# arrays winforms sockets tcp

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

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

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

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

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

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

跟进问题:StreamReader does not stop reading C#

5 个答案:

答案 0 :(得分:3)

您提出的问题几乎总是以某种形式使用序列化和/或数据框架来回答。 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);
}

答案 1 :(得分:2)

好的简单建议你可以使用

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

  • Receiver创建一个数组以接收此数据

  • 循环中的发件人使用WriteLine()发送数组的每个元素 (作为字符串或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++;
}

答案 2 :(得分:2)

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

您应该查看某种形式的message framing,或至少length prefixing。我已经处理TCP套接字协议超过十年了,并且总是使用某种形式(主要是消息帧)。然而,最近,我一直在使用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之上建立应用程序级协议,并且双方必须使用相同的语言(例如,知道长度是存储在一个字节中,知道我们只发送简单的字节数组,没有进一步的上下文...参见“进一步上下文”可能看起来的消息框架。

答案 3 :(得分:1)

您可以将数据序列化为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<values; i++)
    values[i] = m_reader.ReadInt32();

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

答案 4 :(得分:0)

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

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

转换回String

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

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