2

我有一个用 Java 实现的聊天程序。客户端可以向服务器发送许多不同类型的信息(即,加入服务器并发送用户名、密码;请求与服务器上的另一个用户进行私人聊天,断开与服务器的连接等)。

我正在寻找正确的方法让服务器/客户端区分“文本”消息,这些消息只是从一个客户端发送给其他客户端的聊天文本消息,以及“命令”消息(断开连接、请求私人聊天、请求用于服务器或客户端的文件传输等)。

我看到两个选项:

  1. 使用序列化对象,并通过执行“instanceof”来确定它们在接收端是什么
  2. 将数据作为字节数组发送,保留数组的前 N ​​个字节以指定传入数据的“类型”。

这样做的“正确”方法是什么?真正的协议(oscar,irc)如何处理这种情况?

我在这个主题上搜索了一下,只找到了以简单的 Java 聊天应用程序为中心的示例/讨论。没有详细介绍协议设计(我最终打算实践)。

感谢任何帮助...

4

2 回答 2

2

第二种方法要好得多,因为序列化是一种复杂的机制,很容易以错误的方式使用(例如,您可能会将自己绑定到具体序列化类的内部内容)。另外,您的协议将绑定到 JVM 机制。使用一些“协议头”来区分消息是网络协议(FTP、HTTP 等)中的常用方法。当它是文本形式时更好(人们将能够阅读它)。

于 2012-07-29T15:33:23.837 回答
2

您通常有一个小的消息头来标识所有消息中的内容类型,包括标准文本/聊天消息。

您的两个建议中的任何一个都可以。(在您的第二种方法中,您可能还想为数组的长度保留一些字节。)

于 2012-07-29T15:00:02.950 回答