Java中的Socket编程

4

我正在实现一个基于我实验室撰写的RFC的协议。我打算使用Java来运行模拟。我不认为我可以使用对象序列化来传递信息,因为我希望这些消息与其他使用其他语言实现的系统相互操作,我认为这在序列化中是不可能的。

在Java中有哪些特性是可以用来与使用其他语言实现的节点进行通讯的呢?

此外,还有大约50种不同类型的消息可以发送和接收,每种消息都有不同的结构。
例如:hello, bye, register等

每个消息都包含一些需要处理的信息。我计划将每种消息类型都实现为Java类。

最干净的方法是什么,以便在接收节点处确定发送节点发送了什么类型的消息?

例如:作为接收者,我如何知道刚刚向我发送消息的节点想要注册?

如果您能提供一些好的设计模式建议,我将不胜感激。


1
我认为我不能使用对象序列化来传递消息。很抱歉要告诉你,但是对于几种语言,CORBA 就是这样工作的。如果您需要其他东西,可以使用 XML。 - Vineet Reynolds
我之前提供的链接是错误的。那个页面并未列出CORBA语言映射。据我所知,有Ada、C、C ++、Lisp、Ruby、Smalltalk、Java、COBOL、PL/I和Python等多种语言的映射存在,尽管OMG页面未列出全部。 - Vineet Reynolds
4个回答

3
我建议您考虑使用Thrift和Protocol Buffers来解决这个问题。

2
如果你想进行原始套接字通信,你可以让它变得简单或者复杂。通信格式可以很简单,比如只发送一个代表消息类型的数字,或者像XML那样复杂。
然而,已经有很多系统为你完成了这些工作。例如,Corba 或者 Thrift,它们适用于许多编程语言。

2
正如您所指出的,将Java对象序列化是在两个Java进程之间进行通信的方便方法,但对于非Java进程则无法使用。对于这种类型的通信,我建议使用XML或JSON。这两种格式本质上都是符合规范的纯文本格式。大多数语言中都有可用于将本地类型转换为XML或JSON的库。
至于您问题的第二部分,发送和接收系统都必须就共同的消息格式/规范达成一致。例如,以下xml可以表示注册意图,供发送方和接收方使用:
<Command>REGISTER</Command>

@Anand,不,你为什么会这样想呢? - Johan Sjöberg
1
是的。与编程的许多方面一样,存在权衡。XML和JSON比自定义二进制格式更冗长。然而,它们的好处在于更易于维护,因为它们都是人类可读的,并且在允许对规范进行更改方面更加灵活。 - btreat
1
@Johan:2147483647在二进制形式下占用4个字节,在文本形式下占用10个字节。开销超过两倍。 - Anand
一般来说,性能损失可以忽略不计,但最终的决定将取决于您的应用程序需求。此外,由于XML和JSON是文本格式,如果带宽是一个问题,它们具有很高的压缩比率。 - btreat
@btreat:这是我打算实现的低级系统。就像为路由器实现协议一样。我需要在保持开销最小的同时,使其具有互操作性。 - Anand
显示剩余8条评论

0

个人认为协议缓冲区会是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接