【问题标题】:Simple Java TCP socket protocols简单的 Java TCP 套接字协议
【发布时间】:2013-05-27 16:12:55
【问题描述】:

我正在尝试找到一种可靠的方式来发送遵循定义协议的控制消息,以便告诉服务器他将收到什么样的数据。比如我想发送纯文本消息来调用远程方法:

#METHOD1#CLOSE#

或者我想向服务器发送一个序列化的对象:

#OBJECT# .......here comes the serialized object data....#CLOSE#

所以基本上我只想发送完全独立的字符串控制消息 接下来的流内容。

通过将输入流包装到 Scanner 对象中,我可以从输入流中提取字符串,但如果此流是序列化对象,则之后无法恢复该对象。感谢您的帮助。

【问题讨论】:

  • 为什么不为此目的使用许多现有协议之一?例如,JSON-RPC?您有什么具体要求吗?
  • 如果可能的话,它应该是一个纯基于套接字的解决方案。我只是想知道如何做到这一点。
  • “如果可能”不是正当理由。这就是为什么我问你的要求。如果现有协议已经满足您的需求,则根本没有理由破解您自己的协议。不要重新发明轮子!
  • 这是一个作业。字符串协议不是问题,因为我可以轻松地将控制消息附加到实际消息字符串。然而,最简单的解决方案似乎是继承 ObjectOutputStream。

标签: java sockets serialization tcp protocols


【解决方案1】:

您可以使用 Base64 之类的方案(例如,使用 Apache 的库)将对象从字节编码为字符串,然后再返回。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectOutputStream(baos).writeObject(object);
String serializedObject = Base64.encode(baos.toByteArray());

byte[] bytes = Base64.decode(serializedObject);
ByteArrayInputStream baos = new ByteArrayInputStream(bytes);
Object object = new ObjectInputStream(baos).readObject()

【讨论】:

  • Java 的 BASE64Encoder/Decoder 怎么样?所以,基本上我必须将对象编码为字符串,然后将该对象字符串附加到控制消息字符串,对吗?为了解码消息,我读取了代表控制消息的字符,如果消息说它是一个对象,我继续将字符串的其余部分解码为一个对象。
  • 是的,没错。你可以使用任何你喜欢的 Base64 编码器/解码器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2012-08-23
相关资源
最近更新 更多