当前位置:  技术问答>java相关

用DatagramSocket通信的问题?

    来源: 互联网  发布时间:2015-11-04

    本文导语:  我用DatagramSocket编写数据报socket通信,遇到一个很奇怪的问题,请大家帮帮忙. 我是创建了一个线程,其run方法如下:     public void run() {         try {             sock = new DatagramSocket(RECVPORT);           ...

我用DatagramSocket编写数据报socket通信,遇到一个很奇怪的问题,请大家帮帮忙.
我是创建了一个线程,其run方法如下:
    public void run() {
        try {
            sock = new DatagramSocket(RECVPORT);   
            System.out.println("UDP communication start:"+RECVPORT);
            
            while (true) {
                sock.receive(packet);
                ...
            }
                
        } catch (SocketException e) {
            System.err.println("can't open socket");
            return;
        } catch (IOException e) {
            System.err.println("communication error");
            e.printStackTrace();
            return;
        }           
    }

另外有一个发送方法send:
     public void send(byte[] buf) {
        DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, port);   
        try {
            sock.send(packet); 
        } catch (IOException e) {
            System.err.println("communication error");
            e.printStackTrace();
            return;
        }           
    }

当对方程序在运行时,我的程序运行一切正常,但是若对方程序未启动,当我调用send发送数据时,程序会打印出can't open socket,即在run方法中的sock.receive抛出了异常,此后即使再启动对方程序,调用send发送数据时对方都收不到数据,但是send也没有抛出异常.
我实在搞不明白,数据报不是面向无接连的吗,怎么还跟通信对方有关,请高手赐教?

|
我说的参考资料你有没有看?

对方机器没有程序在端口上接收的话,对方机器会返回一个“目标不可到达”的ICMP包,本地主机接收到该包后一般会把它丢弃,只有两种情况例外,一:你的UDP SOCKET是已经“connect”到对方机器的端口上的;二:本地主机操作系统是win2000,它会把该ICMP包发送给应用程序,导致JAVA的receive方法抛出一个“socket已关闭”的例外;所以在win2000上肯定会存在你提到的问题,同样的程序在NT和UNIX上都正常。这是我在以前一个项目中测了好多台机器(包括3台win2000,3台NT,1台HP UNIX, 1台SOLARIS)得出的结论。

|
DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, port);这句中的addr,和port是指定open的地址,端口的!如果没有当然会出错!

|
我在1.4/1.3.1+Win2000下试验,用同一个socket没有这个错误,恐怕还有别的原因吧,你的版本是多少?

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类datagramsocket的类成员方法: datagramsocket定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getsendbuffersize定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getreceivebuffersize定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: gettrafficclass定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getport定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getinetaddress定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getlocalport定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: isclosed定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: disconnect定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: setsotimeout定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: isbound定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: isconnected定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: close定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: setbroadcast定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getremotesocketaddress定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getchannel定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getlocalsocketaddress定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getreuseaddress定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getbroadcast定义及介绍
  • java命名空间java.net类datagramsocket的类成员方法: getsotimeout定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3