2015-08-21 84 views
1

因此,我们有一个服务器具有多个使用多个端口的应用程序。以5729,7614,9231为例。从java中的客户端查找使用的服务器端口

客户端需要连接到这些端口中的一个。所有端口都处于活动状态并等待服务器上的连接,但客户端需要连接的服务器应用程序仅在端口7614上。其他两个端口用于不同的应用程序。

一旦某个活动端口连接,客户端可以在端口ping服务器,并找出它使用什么应用程序(这是已经实现的了解服务器的协议和正常工作)。

的问题是,客户端无法知道正确的端口会是哪个端口是直到它找到它和坪它的方式。服务器应用程序使用的端口不是静态的,并且可能随时更改(而不是我们的代码,因此无法将其固定为静态)。

目前,由于我们不知道什么端口将包含正确的端口号,我们必须通过从0到65525的每个端口递增,尝试连接并ping通连接的端口以确定我们是否连接到正确的应用程序。

这需要永远。有什么办法可以获得正在使用的3个端口的列表吗?也就是说,服务器应用程序调用了新的ServerSocket(端口号)的任何端口?

这必须在java中完成。

编辑客户端需要能够看到服务器当前使用的端口。这个问题的一切都必须在客户端完成。在服务器上使用文件或运行命令不是一个选项。

+0

http://stackoverflow.com/questions/21937533/checking-whether-socket-port-is-available - 我们的问题在某种程度上是类似的,虽然我没有真正的答案... –

回答

0

选项:

  1. 更改您的设计和使用固定的端口号。扫描永远不会起作用。你可以连接任何东西。
  2. 使用命名服务(如LDAP),并让每个服务以其实际端口号与客户端知道的名称绑定到LDAP中;让客户端查找该名称并使用该端口号。我不推荐这个。
  3. 写自己的注册服务,大有作为一样(2),但不必与LDAP API搏斗:只是每个服务发送其名称和端口号到注册表,并有客户问的REG敦促为每个端口号按名称。为了克服糟糕的设计,这又一次需要额外的代码。

我强烈推荐(1)。这是其他人所做的。

-1

对于客户端连接到服务器,客户端应该总是知道服务器端口。 但至于你的情况,服务器不断改变端口。然后,如果您可以控制服务器设计,请将其更改为非常糟糕的设计,否则请在服务器上提供服务器,以便客户端可以询问当前的服务器端口。

如果所有的这已经超出了范围,那么你就只剩下你已经做即扫描端口上最坏的选择。然后,我只能说服务器端口的扫描是单独的服务,它会继续扫描一些心跳并保存最后一个端口。 使此服务多线程化,以便您可以并行地在多个端口上执行ping操作。 当客户端启动时,它可以尝试连接上次保存的端口,如果工作正常..其他请询问您的服务再次开始扫描。再次..这是最糟糕的设计。您还可以在客户端设计中做的一件事是将客户端初始化阶段与服务器连接阶段分离。所以如果你在等待端口扫描,你仍然可以在你的客户端做一些有用的工作。

+0

那将运行在客户端机器不是吗?我需要知道服务器正在使用的端口。 – backcab