2011-04-05 103 views
1

我正在编写一个服务器的代码,可以帮助不同平台上的两个不同的应用程序相互通信。为了形象有点它会是这样的:服务器与两个不同的应用程序的套接字通信,Java

应用1 < ------>服务器< ------>应用2

什么服务器确实是从APP 2后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()部分使用线程,然后将流传递给另一个线程?我读了一些关于频道的内容,但有点偏差,任何例子都会很棒。

+0

您是否考虑过JMS实现。这听起来像是它的设计。 – karakuricoder 2011-04-05 16:37:23

回答

1

使用NIO

它可以让你做非阻塞套接字使用Selector类(包括接受)。

基本上,它给了你更多本地访问系统库和处理你的任务,而无需多线程的能力。

+0

我正在阅读您链接的文章,如果我有任何问题,我会回来! – kotsosh 2011-04-05 19:31:54

+0

我在想,是否可以为服务器使用NIO通道和选择器类,但仍然在其他两个应用程序(即客户端)上使用简单的DataOutput/InputStream,以便我不必更改太多的代码? – kotsosh 2011-04-05 20:55:22

+0

好吧,当然。他们可以写在perl的那个问题:)你只是使用TCP套接字。 – 2011-04-06 00:41:37

0

除非他们另有说明,否则您应该对待它们。

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

然后检查客户端是否有1或2

响应如果同时有1回应什么的只是断开两个。

1

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

0

我认为这样做的“标准”方法是让服务器在端口上侦听,并且当消息进入时,立即分离出一个新线程来处理它,然后返回侦听另一条消息。然后,就像Glowcoder所说的那样,将所有连接都放在同一个循环中,并确定连接后的连接。

我想替代方案是有多个线程,每个线程监听不同的端口。我从来没有试过这样做,我不确定是否有人会阻止,直到连接完成,所以你永远不会到另一个线程。

+0

我会添加一个如何工作的代码示例。 – corsiKa 2011-04-05 16:49:28

+0

但它将不得不等待,对不起 - 紧急工作:) – corsiKa 2011-04-05 17:33:28

相关问题