微软的TCPClient文档实际上非常有用。
如何从TCPClient中读取数据
从套接字中读取数据的Microsoft示例的关键部分是这个:
NetworkStream stream = client.GetStream();
Byte[] data = new Byte[256];
String responseData = String.Empty;
int bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
他们使用
TCPClient类的
GetStream方法,并从流中读取所有可用数据(最多256字节)。
虽然这有点作弊,因为他们只接收一批数据并假设它是完整且正确的消息。只要客户端始终发送相同的内容然后断开连接,它就可以正常工作。
更好的处理方式如下...
如何知道是否接收到消息?
你不知道,你只需继续接收数据,直到没有更多数据为止,然后检查你接收到了什么(或边接收边检查)。
为此,你必须设计消息以包含某种告诉长度的方法(在开头指示长度的整数),或者具有某个消息结束标记(例如回车符),或者具有固定长度的消息。
例如,你的消息规范可能像这样:
DATA
hello friend
END
通过查找紧随回车符后的END,您将知道已找到消息的结尾。同样,开头的DATA标记可帮助您确定消息从何处开始并拆分出消息数据。
最佳方法是如何读取这些数据?
发送/接收的所有数据都将以二进制形式传输,您需要对数据进行编码和解码。在示例中,他们使用内置的ASCII编码类
GetString和
GetBytes方法将二进制数据转换为字符串(反之亦然)。
考虑实施已知协议
我建议(在可能的情况下)使用已知协议,而不仅仅是通过TCP发送纯文本。几乎任何事物都有标准,连接到您的应用程序的任何人都会发现遵循已知和定义的标准更容易。
还有许多预构建的常用协议库,可以为您和您的客户节省麻烦。