2009-07-21 132 views
1

我正在写一个java应用程序,我需要快速发现任何有线或无线本地网络上的其他正在运行的客户端,以建立TCP连接。在WiFi网络上发现客户端

这样做的最好方法是什么?是否有库或代码片段会这样做?

+0

作为一个旁注,我可能会使用tcp连接到客户端,但我并不意味着我需要使用tcp来查找客户端 我还预计最终目标机器将处于通常的192.168.1.1类型主页网络,但我不会奢望假设这将成为我的网络,因此设置预定义的联系人服务器不是一种选择 – 2009-07-21 13:42:33

回答

0

我想你需要在你的子网上的所有IP上扫描应用程序的端口。

什么是可用的IP - 或者你的子网是什么?
由于网络设计为对您的应用程序透明,因此恐怕无法确定这可能是不可能的。

所以,我会用蛮力:选择你的IP并改变最后一个字节。可能太多了,但可能还不够。

或者您发送广播(通常将针对x.x.x.255)并查看谁的答案。 见Datagram BroadcastingMulticasts。但我认为这不再是TCP/IP。

+2

不。这是一个非常糟糕的方法。多播是要走的路:广播对于新业务来说不被认为是可以接受的。当然,它仍然是IP,但你说的TCP只是单播。请参阅mDNS或SSDP在网络上执行服务发现。 – 2012-06-02 15:44:41

1

网络扫描可能很长,在无线网络上甚至更长。如果您需要通过Java快速访问它们,则可以在网络上实施“会议点”服务器。此服务器侦听预定义的端口,客户端在启动时在服务器上注册,服务器可根据请求分发有关客户端的信息。

HTH。

8

多播UDP是一个很好的方法。它用于支持通过本地IP网络(UPnP和ZeroConf)自动发现网络设备的两种技术。

组播UDP不是TCP,但它仍然基于IP,所以使用相同的寻址机制,即IP地址。通常将其与无线电广播进行比较,即多播发送者只需发送1条消息(即,它就像广播),但只有“调入”到多播信道的客户端才会接收到它。

你可以在谷歌或维基百科对这些作为首发快速搜索,但基本思路如下:

  • 客户端启动时,它会发出多播UDP“你好”消息某些预先指定的多播地址和端口(例如UPnP使用239.255.255.250:1900)
  • 现有客户端正在侦听指定地址和端口上的传入多播“hello”消息 - 当客户端收到一个消息时,它会向发送者
  • 发送“hello”消息的客户端从n上的每个现有客户端接收响应etwork,现在知道

如果您正在寻找库使用,UPnP的图书馆可往往是有点重量级和很多民间的一般不喜欢他们,每个客户端的IP地址,所以ZeroConf的可能会更适合。我不知道这些东西的Java实现,但我相信你可以找到一些有点挖掘。

+0

非常好的答案。要在mDNS和SSDP之间进行选择,就发送数据包数而言,mDNS实际上比SSDP更重;两者都有类似的发现模式;操作系统通常有一个mDNS守护进程,您可以将其挂接到(Bonjour或Avahi),而对于SSDP,您更有可能不得不推出自己的应用(Windows上除外)。 – 2012-06-02 15:48:31

0

有一个JGroups工具包可靠的多播通信。它允许使用多播技术自动发现其他客户端,如其他答案中所述。

它还提供了多播套接字之上的通信API。

它用于JBoss,Tomcat等多个项目,为分布式缓存提供基础架构。查看更多here