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

Mar*_*ijn 3 c# sockets binary tcp

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

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

谢谢

bad*_*d99 5

Microsoft 的TCPClient文档实际上非常有用.

如何从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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

DATA你好朋友
END

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

读取此数据的最佳方法是什么?

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

考虑实施已知协议

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

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