我目前正在学习如何在c#上使用套接字,并且对消息在客户端和服务器之间的位置有疑问。
当前,我有一个服务器应用程序和一个客户端应用程序,并且在每个应用程序中我都有一些作为命令的字符串。例如,当客户端需要服务器上的时间时,我有一个像这样的字符串:
public const string GET_TIME_COMMAND = "<GET_TIME_COMMAND>";
然后我在服务器上有一个if语句,即检查从客户端发送的消息是否以该字符串开头,如果是,则使用另一个命令并以json字符串中的时间向客户端发送另一条消息。 / p>
我的问题是,这是一种好方法吗?如果不能,那么您可以建议我采取另一种方法吗?
答案 0 :(得分:0)
请记住,TCP是基于流的连接。您可能会或可能不会在一条消息中得到完整的命令。您甚至可以一次读取多个命令。
为解决此问题,TCP消息通常具有唯一的开始和停止序列或字节,可能不属于消息的一部分。
(SomeCommand)
(
是开始符号,)
是停止符号。
将标头添加到包含消息长度的实际消息之前的另一种方法。
11 S O M E M E S S A G E
其中11是消息长度,somemessage
是实际消息。通常,您将长度以字节或ushort而不是字符串文字形式传输。
在两种情况下,您都必须一遍又一遍地阅读,直到收到一条完整的消息为止-然后您可以将其分派到应用程序中。
TCP也基于连接。您必须连接到远程站点。优点是TCP确保所有消息都按照您放入消息的顺序发送。TCP还将自动重新发送丢失的数据包,您不必担心。
与之相反,UDP是基于消息/数据包的,但是它并不可靠。在某些情况下,您可能会或可能不会收到该消息,并且必须重新发送。 UDP也没有“会话”的概念。如果需要,您必须自己做。
您问题的答案取决于所使用的协议。对于TCP,这不适用于您当前的消息格式。您可能必须在标题之前添加
。您可以使用UDP,但随后可能必须检测并重新发送丢失的消息。