发送序列化数据

时间:2014-12-15 18:37:23

标签: java udp client-server

基本上我正在与客户端和服务器进行一些联网,相互之间来回发送“数据包”。我有它使用基本的可变数据,如整数或字符串来回传递,但现在我想传递一个对象。

所以我知道我必须序列化对象的数据以通过套接字传递它。这也是有效的(因为我可以获得正确的信息,如果我序列化然后立即反序列化)但问题出现在我的服务器收到数据包时。

我的服务器根据数据包的前2个字符解释数据包数据。因此01foobar是一种与分配给“01”的数据包相关的数据包,02foobar也是一个不同的数据包。因此,我不知道使用附加对象执行此操作的最佳方法。这是什么意思......

我现在尝试做的方法是,序列化我的对象并获取它的字符串。然后在03前面附加到前面。所以基本上我有一个看起来像03[B@3e9513b7(或其他)的字符串,然后在该字符串上执行getBytes(),这给了我另一个byte[](所以我可以通过套接字发送它)。然后,当服务器收到该信息时,我可以将03关闭,我只剩下[B@3e9513b7。问题是,[B@3e9513b7现在是一个字符串,而不是byte [],并且为了反序列化,我需要发送它在序列化数据时给它的byte[]。所以这让我想方设法[B@3e9513b7成为byte[](也就是说,当我对toString() byte[] [B@3e9513b7时,它返回byte[])但是因为它会给[B@3e9513b7一个新的byte[]作为一个字符串,因此在分配它时遇到了问题。很明显,当我发送它进行反序列化时,它有{{1}},它不知道该怎么做并抛出错误。

所以我必须想象有一个更好的方法来做到这一点,而我只是让事情变得更加复杂。有什么建议?如果需要,我可以提供代码片段。

谢谢你们!

编辑:我想我应该提一下,我正在使用Java使用UDP套接字。

1 个答案:

答案 0 :(得分:0)

如果您正在为客户端 - 服务器通信寻找可靠而有效的解决方案,我建议您查看Netty

关于如何序列化/反序列化对象,你有很多选择,如Java序列化,XML,JSON ......

您必须在UDP数据报中传递序列化对象。但是,请注意UDP数据报的大小是有限的。如果要交换大对象,可能需要切换到更可靠的TCP传输。

您可能还想查看SOAP / REST web services