2011-09-26 62 views
0

我想使用Java UDP协议将数据包从一台主机发送到另一台对等主机。Java UDP数据包读取失败

一个主机发送数据,另一个主机读取数据。然而,相应的读取保持阻塞,因此不接收数据。我可以看到使用wireshark将发送者数据包发送到正确的目的地,但接收者不会接收它。读取操作会无限期地阻塞。

请帮忙。 代码cient:

//CLIENT CLASS 
//Sections ommited.... 
DatagramSocket so = new DatagramSocket(port); 
    protected void send(byte[] buffer,int packetsize){ 
     DatagramPacket p; 
     try { 
      myClient.notifyInform("Sending data to "+inetaddress+" on"+port+"\n"); 
      p=new DatagramPacket(buffer,buffer.length,InetAddress.getByName(inetaddress),port); 
      writeLock.lock(); 
      try{ 
       so.send(p); 
      }finally{ 
       writeLock.unlock(); 
      } 
     } catch (UnknownHostException e) { 
      myClient.perror("Could not connect to peer:"+e.getMessage()+"\n"); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      myClient.perror("IOException while sending to peer.\n"); 
      e.printStackTrace(); 
     } 
    } 

    protected DatagramPacket read(){ 
     byte[] buf=new byte[bufsize]; 
     DatagramPacket p=new DatagramPacket(buf,buf.length);//TODO check these values, what should buffer be? just made it psize*10 for now 
     readLock.lock(); 
     try{     
      myClient.notifyInform("receiving data\n"); 
      so.receive(p); 
      this.myclient.notifyInform(String.valueOf(p.getData().length)+"\n"); 
     } catch (IOException e) { 
      myClient.perror("IOException while reading from peer.\n"); 
      e.printStackTrace(); 
     }finally{ 
      readLock.unlock(); 
     } 
     return p; 
    } 

    protected void beginRead() { 
     while(active) { 

      System.out.println("########################"); 
      byte[] data=this.read().getData(); 
      myClient.notifyInform("Receiving data\n"); 
     } 

    } 
    protected void beginSend(){ 
     forkWork(new Runnable(){ 

      @Override 
      public void run() { 

       byte[] sendBuffer=new byte[bufsize]; 
       int cnt; 
       while(callActive){ 
        try{ 
         sourceLock.lock(); 
         cnt=dataSource.read(sendBuffer, 0, bufsize); 
        }finally{ 
         sourceLock.unlock(); 
        } 
        if (cnt >0) { 
         send(sendBuffer, packetsize); 
        } 
       } 
      } 

     }); 

    } 

更新:我犯了一个错误,我终于找到了。绑定端口并修复该错误后,它现在可以工作。

+1

可以在防火墙块它?你使用什么特殊的多播地址? –

+0

不,我将所有防火墙关闭,并且不使用多播。 – Vort3x

+0

两种简单的可能性:其他的东西已经绑定了这个端口,或者你在一个Unix/Linux平台上,试图绑定一个小于1024而不是根的端口号。 –

回答

3

您需要指定数据报套接字侦听这样的端口:

this.so = new DatagramSocket(SOME_NUMBER_HERE); 

,并确保将其发送到相同的端口号在send()方法

1

您的接收DatagramSocket正在侦听发件人发送的IP:端口吗?

+0

DatagramSocket没有指定它。它只读取发送给它的内容?这是我的socket init代码:this.so = new DatagramSocket(); – Vort3x

+0

@ Vort3x,如果它没有监听任何IP和端口,它将听不到任何声音。 –

+0

@ Vort3x恰恰相反。 Javadoc特别说'新的DatagramSocket()将它绑定到任何可用的端口“。所以除非你巧妙地发送到那个端口,否则它将不会收到这些传输。这就是绑定和端口号的含义。所以不要这样做。尝试'新的DatagramSocket(端口)'; 'port'和你发送的一样。 – EJP