我有两个依赖基于字节的面向连接的协议进行通信的 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
}
问题
你如何处理这些情况?这里有哪些最佳实践?有些协议对总长度字段进行了编码,有些则没有。一些协议数据单元具有可变长度。这里有合理的方法吗?也许某种模式定义?我不想再为这个问题产生丑陋和令人困惑的代码。