2

我有一个应用程序,我必须在两个实体之间发送信号和数据。哪种方式是最佳实践,为什么?

  1. 打开4个socket,2个用于双向信号,2个用于双向数据
  2. 为数据和信号打开 2 个套接字
  3. 只需打开 1 个套接字并过滤信号和数据
4

4 回答 4

2

首先,套接字是全双工的,即您不需要单独的套接字(连接)来进行发送和接收。

其次,如果不深入细节,很难说清楚。然而,了解 HTTP(命令/标头和数据的一个连接)和 FTP(命令和数据的单独连接)的历史似乎 HTTP 设计者做出了更好的选择。两个连接需要维护更多的代码,而且一些防火墙不喜欢在传输大量数据时挂起、空闲的 FTP 命令连接。

因此,选择一个连接,很容易区分信号和数据(标志、标头等)。传入和传出通道也是完全正交的。

于 2012-10-20T12:30:00.133 回答
0

有一种可能的“中间方式”——使用 JBoss 远程处理或类似的方法在一个真实套接字之上多路复用多个虚拟套接字。这样,您可以在应用程序级别保持数据和控制通道分离,但在操作系统级别仍然只需要一个 TCP 端口(因此最多一个防火墙漏洞)。

于 2012-10-20T12:40:38.247 回答
0

为什么不能只为所有数据提供 1 个套接字,为所有信号提供 1 个套接字。您可以在从同一个套接字读取来自远程实体的信号的同时向远程实体发送信号。这有点像 FTP(非被动)的工作方式,您有一个控制连接,然后一个用于实际数据传输。

拥有 4 个套接字似乎有点矫枉过正,但我​​不知道信号或数据的上下文。

如果您不介意更多代码来解码网络通信,您绝对可以在一个套接字中完成所有操作。如果你愿意的话,它需要更多地考虑实际的通信,一个更好的“协议”。2 插座和 1 插座型号都很好。

于 2012-10-20T12:30:08.857 回答
0

另一种方式:使用专门为实时应用程序构建的中间件,如 0MQ

实例化 ØMQ:

Jzmq obj = new Jzmq (hostname);

其中 hostname 是运行 zmq_server 的机器的名称或 IP 地址。

要创建连线,可以使用 createExchange、createQueue 和 bind 函数。有关接线机制如何工作的详细说明,请查看此处。

int eid = obj.createExchange ("E", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5555");
obj.createQueue ("Q", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5556");
obj.bind ("E", "Q");

发送消息非常简单。消息以字节数组的形式提供:

byte msg [] = {1, 2, 3, 4, 5, 6};
obj.send (eid, msg);

接收消息就更简单了:

byte [] msg = obj.receive ();

此处提供完整样本。

于 2012-10-20T18:30:11.677 回答