来自微软的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);
它们使用TCPClient 类的GetStream 方法并从流中读取所有可用数据(最多256 个字节)。
不过,这有点作弊,因为他们只是接收到大量数据并假设它是完整且正确的消息。只要您的客户端是 100% 可预测的,它就会正常工作,因为它总是发送相同的内容然后断开连接。
以下更好的处理方式...
您如何知道是否收到了消息?
你没有,你只是继续接收数据,直到没有更多的数据,然后检查你收到了什么(或检查你去)。
为此,您必须设计消息以包含某种方式来告知长度(开头的整数表示长度),或者有一些消息结束标记(例如回车)或有一个固定长度的消息。
例如,您的消息规范可能是这样的:
数据
你好朋友
结束
通过查找 END 后跟回车,您将知道您已找到消息的结尾。同样,开头的 DATA 标记可帮助您判断消息从何处开始并拆分消息数据。
读取这些数据的最佳方法是什么?
所有发送/接收的数据都是二进制的,您需要对数据进行编码和解码。在示例中,他们使用内置的 ASCII 编码类 GetString 和 GetBytes 方法将二进制数据转换为字符串(反之亦然)。
考虑实现一个已知协议
我建议(在可能的情况下)使用已建立的协议,而不仅仅是通过 TCP 发送纯文本。几乎所有东西都有标准,任何连接到您的应用程序的人都会发现遵循已知和定义的标准更容易。
还有许多用于常用协议的预构建库,为您和您的客户省去麻烦。