2013-05-27 105 views
0

我试图找到一种可靠的方式来发送控制消息,服从一个定义的协议,以告诉服务器他将收到什么样的数据。例如,我想送一个纯文本消息调用一个远程方法:简单的Java TCP套接字协议

#METHOD1#CLOSE# 

或我想序列化对象发送到服务器:

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

所以基本上我只是想送字符串控制消息,它们完全独立于后面的流内容 。

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

+1

为什么不使用众多现有协议之一来达到此目的?例如,JSON-RPC?你有什么具体要求? – fge

+0

如果可能,它应该是一个纯粹的基于套接字的解决方案。我只是想知道如何做到这一点。如果可能,“ – user1812379

+1

”是无效的原因。这就是为什么我问你的要求。如果现有的协议已经满足您的需要,那么根本没有理由破解您自己的协议。不要重新发明轮子! – fge

回答

1

您可以使用像Base64这样的方案(例如,使用Apache的库)将Object从字节编码为字符串,然后返回。

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() 
+0

Java的BASE64编码器/解码器怎么样?所以,基本上我必须将对象编码为一个字符串,然后将该对象字符串附加到控制消息字符串,对吧?为了解码消息,我读取了表示控制消息的字符,如果消息说它是一个对象,我继续解码字符串的其余部分到一个对象。 – user1812379

+0

是的,没错。您可以使用任何您喜欢的Base64编码器/解码器。 –