【问题标题】:Socket communication of server with two different applications, Java服务器与两个不同应用程序的套接字通信,Java
【发布时间】:2011-04-05 16:33:35
【问题描述】:

我正在为服务器编写代码,该代码将帮助不同平台上的两个不同应用程序相互通信。为了形象化一点,它会是这样的:

App1服务器App2

服务器所做的是从 app2 获取 var1,将其写入 app1,然后从 app1 读取 var2 并将其写入 app2。像这样:

while(true){
var1 = app2stream.readInt();
app1stream.writeInt(var1);
var2 = app1stream.readDouble();
app2stream.writeDouble(var2);
}

我的问题是,有时我的服务器上有这段代码:

app1.accept();
app2.accept();

这意味着无论如何,鉴于服务器始终在运行,app1 应该首先连接,因为 app1.accept() 是一个阻塞方法。

有没有办法解决这个问题?不管谁先“来”,让这两个应用程序连接到服务器,然后等待服务器继续执行上述代码,这将是很棒的。我可以将线程仅用于 accept() 部分,然后将流传递给另一个线程吗?我读了一些关于频道的文章,但有点困惑,任何例子都会很棒。

【问题讨论】:

  • 您是否考虑过 JMS 实现。这听起来正是它的设计目的。

标签: java blocking serversocket


【解决方案1】:

使用NIO

它允许您使用Selector 类来执行非阻塞套接字(包括接受)。

基本上,它为您提供了对系统库的更多本机访问权限以及无需多线程即可处理您的任务的能力。

【讨论】:

  • 我正在阅读您链接的文章,如果我有任何问题,我会回来!
  • 我想知道是否可以在服务器上使用 NIO 通道和选择器类,但在其他两个应用程序(它们是客户端)上仍然使用简单的 DataOutput/InputStream,这样我就不必更改了代码太多?
  • 嗯,当然。为此,它们可以用 perl 编写 :) 你只是在使用 TCP 套接字。
【解决方案2】:

只有一个接受调用和一个服务器套接字。您可以在连接后确定哪个应用程序已连接。如果您无法从连接详细信息中获取它,请让他们发送一个身份验证码(无论如何可能是个好主意),您可以将其映射到您的应用。

【讨论】:

    【解决方案3】:

    除非他们另有说明,否则您可能应该对他们一视同仁。

    例如,当每个套接字连接时发送一个“什么客户端?”消息。

    然后检查客户端响应的是 1 还是 2。

    如果两者都以 1 或其他东西响应,则将两者断开。

    【讨论】:

      【解决方案4】:

      我认为执行此操作的“标准”方法是让服务器侦听端口,当有消息进来时,立即启动一个新线程来处理它,然后再回去侦听另一条消息。然后,正如 Glowcoder 所说,在同一个循环中建立所有连接,并在连接后弄清楚哪个是哪个。

      我想另一种方法是拥有多个线程,每个线程都侦听不同的端口。我从来没有尝试过这样做,我不确定在建立连接之前是否会阻塞,所以你永远不会到达另一个线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        相关资源
        最近更新 更多