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

c# Sockets messages between client and server

我目前正在学习如何在 C# 上使用套接字,并且有一个关于客户端和服务器之间的消息应该如何传输的问题。

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

public const string GET_TIME_COMMAND = "<GET_TIME_COMMAND>";

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

我的问题是,这是一个很好的方法吗?如果不是,你能建议我另一种方法吗?

TCP

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

为了解决这个问题,TCP 消息通常有一个唯一的开始和停止序列或字节,可能不是消息的一部分。

(SomeCommand)

其中 ( 是起点,) 是终点。

另一种方法 os 在包含消息长度的实际消息前添加 header。

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

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

在这两种情况下,您都必须一遍又一遍地阅读,直到获得一条完整的消息 - 然后您可以将其发送到应用程序中。

TCP 也是基于连接的。您必须连接到远程站点。优点是 TCP 确保所有消息都按照您放入它们的顺序发送。TCP 还会自动 re-send lost 数据包,您不必担心。

UDP

相反,UDP是基于message/packet的,但它不可靠。您可能会或可能不会收到消息,并且在某些情况下必须 re-send 它。 UDP 也没有 "session" 的概念。如果需要,您必须自己做。

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

您可以使用 UDP,但是您可能必须检测并 re-send 收到 lost 的消息。