如何在没有物理服务器的情况下连接软件-Java



我一直在尝试构建一个Client-Server程序。一旦安装在计算机(主机)上,主机就应该能够同时作为主机和服务器工作(看起来很容易,但还不是全部)。该程序应该能够在没有物理中介服务器的网络中工作,该物理中介服务器将用于连接运行该程序的各个主机。每个主机都应该足够智能,以便获得运行该程序的网络中所有其他主机的名称和IP。

->简单地说,比如蓝牙设备如何检测其他蓝牙设备。

这应该适用于各种网络:无线网络,局域网等。

我该如何实现这一点。这可能吗。任何想法都是受欢迎的——即使不是我所要求的。任何接近的东西都是好的。

提前谢谢大家。

您需要了解由三种技术组成的零配置网络:

  • 链接本地寻址
  • 多播DNS
  • DNS服务发现

基本上,您的服务进程会选择一个类型、名称和端口,并通过向网络上充当DNS服务器的其他服务注册来进行广播。很明显,冲突解决和故障切换正在进行,但简而言之,就是服务方面的问题。

然后,客户端根据类型广播对服务的请求,并获得匹配服务的注册详细信息,从而允许它们进行连接。

为了了解背景,请查看DNS服务发现和零配置网络概述,或者为了了解实际情况,我建议获得一份零配置网络-定义指南。

在Java方面,有几个选项。

具有讽刺意味的是,苹果的Bonjour SDK for Windows包含一个Java API(我在上面提到的书中使用的那个),它在Windows上运行得很好,尽管在Linux上不是现成的(我放弃了重新编译API的本地部分)。

由于这个限制,我最终使用了jmDNS,它没有很好的文档记录,但运行得很好,下载中有足够的例子让你开始。

EDIT:这里是一些使用jmDNS的代码示例。

注册服务

这只是在网络上注册一个服务,在执行此操作之前,您的服务器需要侦听TCP连接。

ServiceInfo serviceInfo = ServiceInfo.create(
"_exp._tcp.local.",
"example",
"5001",
"Example Service"
);
JmDNS jmdns = JmDNS.create();
jmdns.registerService(serviceInfo);

服务查询

这只是在网络上找到一个服务,您的客户端仍然需要连接。

JmDNS dns = JmDNS.create();
dns.addServiceListener("_exp._tcp.local.", new ServiceListenerImpl()));
dns.list("_exp._tcp.local.", 10 * 1000);        

这是一个基本的倾听者。

private class ServiceListenerImpl implements ServiceListener
{
@Override
public void serviceAdded(ServiceEvent serviceEvent)
{    
serviceEvent.getDNS().requestServiceInfo(serviceEvent.getType(), serviceEvent.getName());
}
@Override
public void serviceRemoved(ServiceEvent serviceEvent)
{
//Handle service dropping out.
}
@Override
public void serviceResolved(ServiceEvent serviceEvent)
{
Socket socket = new Socket(
new InetSocketAddress(serviceEvent.getInfo().getInetAddress(), serviceEvent.getInfo().getPort())
).open();
...
}
}  

最新更新