c#在客户端和服务器之间套接字消息

时间:2018-07-03 16:52:58

标签: c# sockets client-server

我目前正在学习如何在c#上使用套接字,并且对消息在客户端和服务器之间的位置有疑问。

当前,我有一个服务器应用程序和一个客户端应用程序,并且在每个应用程序中我都有一些作为命令的字符串。例如,当客户端需要服务器上的时间时,我有一个像这样的字符串:

public const string GET_TIME_COMMAND = "<GET_TIME_COMMAND>";

然后我在服务器上有一个if语句,即检查从客户端发送的消息是否以该字符串开头,如果是,则使用另一个命令并以json字符串中的时间向客户端发送另一条消息。 / p>

我的问题是,这是一种好方法吗?如果不能,那么您可以建议我采取另一种方法吗?

1 个答案:

答案 0 :(得分:0)

TCP

请记住,TCP是基于流的连接。您可能会或可能不会在一条消息中得到完整的命令。您甚至可以一次读取多个命令。

为解决此问题,TCP消息通常具有唯一的开始和停止序列或字节,可能不属于消息的一部分。

(SomeCommand)

(是开始符号,)是停止符号。

将标头添加到包含消息长度的实际消息之前的另一种方法。

11 S O M E M E S S A G E

其中11是消息长度,somemessage是实际消息。通常,您将长度以字节或ushort而不是字符串文字形式传输。

在两种情况下,您都必须一遍又一遍地阅读,直到收到一条完整的消息为止-然后您可以将其分派到应用程序中。

TCP也基于连接。您必须连接到远程站点。优点是TCP确保所有消息都按照您放入消息的顺序发送。TCP还将自动重新发送丢失的数据包,您不必担心。

UDP

与之相反,UDP是基于消息/数据包的,但是它并不可靠。在某些情况下,您可能会或可能不会收到该消息,并且必须重新发送。 UDP也没有“会话”的概念。如果需要,您必须自己做。

您问题的答案取决于所使用的协议。对于TCP,这不适用于您当前的消息格式。您可能必须在标题之前添加

您可以使用UDP,但随后可能必须检测并重新发送丢失的消息。