用Jmdns的注册服务、方法的使用

本文介绍了如何使用Jmdns在本地局域网中注册和发现服务,适用于通信和信息发送。Jmdns的ServiceAdded方法用于获取设备信息,但存在ServiceInfo可能为null的情况。此外,文章还提到了使用ExpandableListView的示例,并提供了资源下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Jmdns在本地局域网中Java实现的注册与发现的服务,用于通信、发送信息,最近在使用这个jmdns,研究了一下,分享一下。

关于ServiceAdded方法说明:用来获取设备信息的已封装的方法,获取设备的信息,但是有时ServiceInfo为null,但是这个每次测试的结果都至少有一个ServiceInfo不为空,这个和设备有点关系。这种几率还是很小的


import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;
import javax.jmdns.ServiceTypeListener;


/**
 * 创建日期:2014-12-23 下午07:54:40
 * 项目名称:JmdnsTest 
 * @author NantiJiang
 * @version 1.0
 * @since JDK 1.6.0_21
 * 文件名称: DiscoverServices.java
 * 类说明:
 */
public class DiscoverServices {

    static class SampleListener implements ServiceListener  ,ServiceTypeListener{
        
    	//serviceAdded 方法会自动返回搜索到服务的相关信息,比如一般都会带有ip地址、端口、serviceInfo信息,这些信息一般都是搜索到的注册的设备的信息,用这个方法就可以拿到设备的所有信息
    	//有的时候这个信息ServiceInfo的值是null,这个几率不是很大,但是和手机的硬件设备有点关系(htc e1搜索不是很乐观、ASUS me302c和三星GT-I8160不错),看情况通常很少
    	@Override
        public void serviceAdded(ServiceEvent event) {
            System.out.println("Service added   : " + event.getName() + "." + event.getType());
        }
    	
    	//移除某一个服务
        @Override
        public void serviceRemoved(ServiceEvent event) {
            System.out.println("Service removed : " + event.getName() + "." + event.getType());
        }

        @Override
        public void serviceResolved(ServiceEvent event) {//什么时候监听接口回调该方法
            System.out.println("Service resolved: " + event.getInfo());
        }
        //搜索局域网设备的type,该方法和ServiceAdded很像,但是这个方法不到serviceInfo,event的serviceInfo是为null
		@Override
		public void serviceTypeAdded(ServiceEvent event) {
			 System.out.println(" serviceTypeAdded: " + event.getInfo());
			
		}

		@Override
		public void subTypeForServiceTypeAdded(ServiceEvent event) {
			System.out.println(" subTypeForServiceTypeAdded: " + event.getInfo());
			
		}
    }

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) {
        try {

            // Activate these lines to see log messages of JmDNS
            boolean log = false;
            if (log) {
                Logger logger = Logger.getLogger(JmDNS.class.getName());
                ConsoleHandler handler = new ConsoleHandler();
                logger.addHandler(handler);
                logger.setLevel(Level.FINER);
                handler.setLevel(Level.FINER);
            }

            final JmDNS jmdns = JmDNS.create();
            String type = "_http._tcp.local.";
            if(args.length > 0) {
                type = args[0];
            }
            jmdns.addServiceTypeListener(new SampleListener());//事实证明,执行到这个方法时会去回调(该监听的相关方法)serviceAdded、serviceRemove、serviceresolved
            jmdns.addServiceListener(type, new SampleListener());//执行到这个方法的时候,会去回调(该监听的相关方法)serviceTypeAdded、subTypeForServiceTypeAdded  

            System.out.println("Press q and Enter, to quit");
            int b;
            while ((b = System.in.read()) != -1 && (char) b != 'q') {
                /* Stub */
            }
            jmdns.close();
            System.out.println("Done");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


下面图是用ExpandableListView






本文由NantiJey原创总结,如需转载请标明出处 :http://blog.youkuaiyun.com/jss4j/article/details/42107927


资源下载地址:http://download.youkuaiyun.com/detail/hiberatejss/8292069



利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址的局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册一下信息:我提供FTP服务,我的IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,我要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其他的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供FTP服务,所以B主机就知道了A主机的IP地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值