Java UDP数据包读取失败

时间:2011-09-26 08:41:08

标签: java udp

我正在尝试使用java UDP协议将数据包从一个主机发送到另一个对等主机。

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

请帮忙。 客户代码:

//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);
                    }
                }
            }

        });

    }

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

2 个答案:

答案 0 :(得分:3)

您需要指定数据报套接字正在侦听的端口,如下所示:

 this.so = new DatagramSocket(SOME_NUMBER_HERE);

并确保将其发送到send()方法

中的相同端口号

答案 1 :(得分:1)

您的接收DatagramSocket是否正在侦听发送方发送给的IP:端口?