C#从套接字读取二进制数据

时间:2010-09-13 15:03:24

标签: c# sockets tcp binary

我正在开发一个从套接字读取和写入二进制数据的应用程序。所以首先我用TcpClient创建一个套接字。但我坚持从套接字读取数据。是否有关于如何从套接字读取二进制数据的代码示例?

具体,有两件事我不明白。首先,我如何知道邮件是否“已收到”?我需要为此创建某种循环吗?第二:读取这些数据的最佳方法是什么,因为我收到的数据是二进制数据而不仅仅是普通字符串。

由于

4 个答案:

答案 0 :(得分:5)

来自Microsoft的TCPClient documentation实际上非常有用。

如何从TCPClient中读取数据

Microsoft示例中用于从套接字读取数据的关键部分是:

// Get the stream
NetworkStream stream = client.GetStream();
Byte[] data = new Byte[256];

// String to store the response ASCII representation.
String responseData = String.Empty;

// Read the first batch of the TcpServer response bytes.
int bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);

他们使用GetStream类的TCPClient方法,并从流中读取所有可用数据(最多256个字节)。

这有点作弊,因为他们只是接收了大量数据,并假设它是一个完整和正确的消息。只要您的客户端100%可预测,它将始终发送相同的内容然后断开连接,它将正常工作。

更好的处理方式......

您如何知道是否收到了邮件?

你没有,你只是继续接收数据,直到没有更多,然后检查你收到了什么(或检查你去)。

要做到这一点,你必须设计消息以包含一些告诉长度的方法(开头的整数表示长度),或者有一些消息标记结束(例如回车)或者有一个固定长度的消息。 / p>

例如,您的消息规范可能如下:

  

DATA   你好朋友
  END

通过查找END然后回车,您将知道您已找到消息的结尾。同样,开头的DATA标记可以帮助您判断消息的开始位置并分割出消息数据。

阅读此数据的最佳方式是什么?

发送/接收的所有数据都是二进制的,您需要对数据进行编码和解码。在该示例中,他们使用内置的ASCII编码类GetStringGetBytes方法将二进制数据转换为字符串(反之亦然)。

考虑实施已知协议

我建议(尽可能)使用已建立的协议,而不是仅通过TCP发送纯文本。几乎任何东西都有标准,任何连接到您的应用程序的人都会发现更容易遵循已知和定义的标准。

还有许多常用协议的预建库可以为您和您的客户节省时间。

答案 1 :(得分:1)

在这种情况下,我将遵循MSDN。具体来说,使用TcpClients(维护连接 - 您已经在进行),TcpListeners(接受连接并开始通信)以及serialization(将数据转换为二进制文件) )。

答案 2 :(得分:0)

通过套接字发送的所有数据都是二进制的。您可以将其解释为其他内容,例如字符串。您可以使用这些功能来发送或接收数据。您可以使用从NetworkStream stream = client.GetStream();获得的NetworkStream来呼叫它们。请注意,这些函数首先发送一个带有数据大小的int。

public void send(NetworkStream stream, byte[] buf) {
    stream.Write(BitConverter.GetBytes(buf.Length), 0, 4);
    stream.Write(buf, 0, buf.Length);
}

public byte[] receive(NetworkStream stream) {
    byte[] lengthBytes = new byte[4];
    int read = stream.Read(lengthBytes, 0, 4);
    // read contains the number of read bytes, so we can check it if we want
    int length = BitConverter.GetInt32(lengthBytes);
    byte[] buf = new byte[length];
    stream.Read(buf, 0, buf.length);
    return buf;
}

答案 3 :(得分:0)

第一步是在TcpClient实例上调用GetStream,它为您提供对您发送和接收二进制数据的NetworkStream的引用。您可以将其包装在BinaryReader和BinaryWriter中以发送和接收.NET原语(如Int32s,Strings等)或直接使用NetworkStream方法进行字节数组。您会发现NetworkStream.Read,NetworkStream.BeginRead和NetworkStream.DataAvailable成员很有用;有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream_members.aspx