服务器 - 客户端项目(消息协议)

时间:2011-08-20 22:42:08

标签: c# byte bytearray memorystream

我想做一个项目,包括服务器和客户端,使用TcpSocket网络通信(我使用TcpListener作为服务器,TcpClient作为客户端)和线程。但到目前为止,线程并没有给我任何问题。

但是它做了什么,是另一回事......因为项目不会只包括聊天,(还会创建新游戏,加入游戏,制作动作,离开游戏),我需要以某种方式定义消息格式。< / p>

我已阅读有关消息传递协议以及使用每条消息的前几个字节来告诉服务器他们正在尝试做什么。问题是我不知道该怎么做。那么有人能告诉我一个创建格式化消息的例子吗?

也许我很高兴提到我使用StreamReader和StreamWriter类在服务器和客户端之间传递数据。这是一个好方法吗?


添加:

我现在的问题是如何分离这些数据,以便服务器知道如何处理它。我已经读过关于使用第一个字节来“保留”消息的类型。但问题是我不知道如何解决这个问题。到目前为止,我只使用StreamReader和StreamWriter类来传递字符串。如果我使用这些编码,如果你知道我的意思,它将变得太乱(不可识别)。

所以我需要做类似的事情:

发送字节:

  • 数据类型的前几个字节(但我不知道要使用哪个类,可能是BinaryWriter,另一边是BinaryReader?)

  • 消息的其余部分

  • 服务器上的
  • 我必须有一些能识别这些“前几个字节”的代码,这样代码就会知道如何处理消息的测试。

  • 并基于这些“前几个字节”,代码必须将数据发送回客户端

你对这个看起来有什么想法吗?我的意思是作为一个骨架(一些基本的,所以我可以继续使用它)。

非常感谢每一点帮助。


我在stackOverflow.com上找到了一个示例here。它似乎是一个正确方向的代码。你觉得怎么样?

2 个答案:

答案 0 :(得分:0)

可能比定义自己的协议容易得多的一个选项是使用一些现有的库,例如WCFJSON-RPC

像这样的图书馆有它们的缺点(它们通常会产生相对较大的输出)。如果您以模块化方式构建应用程序,那么当您发现第一个解决方案不够好时,您可以在以后轻松切换通信后端。

答案 1 :(得分:0)

您有几个选择: 使邮件格式为文本 - 包括其标题。因此,标头包含消息大小,写为文本字符串,并以一些终结符结束(例如\ r \ n).HTTP采用这种方法 - 标题是文本。收到消息时,使用ReadLine处理它,并使用int.TryParse(str)之类的东西解析标题行。

发送讯息:

output.WriteLine(message.Length);
output.Write(message);

接收消息:

int len = int.Parse(input.ReadLine());
//message is the next 'len' characters

第二种选择:整个消息采用二进制格式 - 消息头是二进制的,并指定消息长度等。消息内容被写为字节流,使用例如Encoding.UTF8.GetBytes(str)编码。

或者,也许使用HTTP协议?我相信以HttpListener的形式对HTTP服务器提供基本支持。这是simple intro to HttpListener

无论你做什么,都要避免使用WCF:)