【发布时间】:2013-07-10 13:50:53
【问题描述】:
我有两个依赖于基于字节的面向连接协议的java项目(简单的多人游戏) 用于交流。
在这两种情况下,我都不满意通信的实现,因为我无法提出一种智能的、非冗长和面向对象的编写方式,尤其是解析字节。
对于写作我有类似的东西
ProtocolDataUnitX pdux = new ProtocolDataUnitX("MyName", 2013);
int[] bytes = pdux.getBytes();
out.write(bytes); // surrounded with try/catch etc.
这在某种程度上是可以接受的,因为我有一个带有一些字节转换便利方法的AbstractPDU 类。但我必须定义getBytes() 方法
对于每个协议数据单元 (pdu)。
我解析传入字节流的方法缺乏更多创新。
private InputStream in;
...
@Override
public void run() {
int c;
while ((c = in.read()) != -1)) {
if (c == 0x01) {
// 0x01 means we have pdu #1 and can continue reading
// since we know what is coming.
// after we have all bytes and know the pdu
// we can determine the paramters. I.e., every pdu has a
// reverse constructor: bytes -> pdu
}
问题
您如何处理这些情况?这里有哪些最佳做法?有些协议对总长度字段进行了编码,有些则没有。一些协议数据单元具有可变长度。 这里有合理的方法吗?也许某种模式定义?我不想再为此编写丑陋和令人困惑的代码。
【问题讨论】:
-
您是否考虑过使用 Google protobufs (code.google.com/p/protobuf) 并让他们为您完成所有繁重的工作?
-
以前从未听说过。谢谢,听起来很有趣。这里有一个指向 Java 源代码的链接 code.google.com/p/protobuf/source/browse/trunk/java/src/main/…
-
好的,我会回答的。
-
好的,但我现在不能接受,因为我仍在等待答案,这些答案能给我提供更广泛的设计原则和解决我的问题的方法。即使我对谷歌资源进行逆向工程,我也只有一种方法。
-
好吧,我已经尽力了。请记住,像您这样的开放式问题通常被认为不适合 SO。见stackoverflow.com/help/dont-ask
标签: java parsing tcp protocols