现在的问题是这样的,对方把接收到的数据发送到其本机的11012端口上,我现在想通过DatagramSocket 接收的报文,        public static void main(String args[]) throws UnknownHostException{
                InetAddress ip =InetAddress.getByName("10.11.1.22";
                System.out.println(ip);
                try {
                        ds =new DatagramSocket(ClientPort,ip);
                        while(true){
                                ds.receive(new DatagramPacket(buff,buff.length));
                                System.out.println("客户端收到了服务端的信息:"+new String(buff,0,buff.length));
                        }
                } catch (SocketException e) {
                        e.printStackTrace();
                }catch(IOException e){
                        e.printStackTrace();
                }
        } 运行之后,结果报如下错误,大家帮忙分析一下:
java.net.BindException: Cannot assign requested address: Cannot bind
        at java.net.PlainDatagramSocketImpl.bind0(Native Method)
        at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:82)
        at java.net.DatagramSocket.bind(DatagramSocket.java:36
        at java.net.DatagramSocket.<init>(DatagramSocket.java:210)
        at java.net.DatagramSocket.<init>(DatagramSocket.java:261)
*********************** 

解决方案 »

  1.   

    ds =new DatagramSocket(ip,ClientPort);
      

  2.   

    在Eclipse中开两个程序,下面分别是接受端和发送端。先要运行接收端,然后运行发送端。public static void receive() {
    try {
    DatagramSocket ds = new DatagramSocket(8585);
    byte[] buf = new byte[100];
    DatagramPacket dp = new DatagramPacket(buf, 100);
    ds.receive(dp);
    System.out.println(new String(buf, 0, dp.getLength()));
    String str = "OK,i'M received";
    DatagramPacket dpSend = new DatagramPacket(str.getBytes(), str
    .length(),
    dp.getAddress(), dp.getPort());
    ds.send(dpSend);
    ds.close();
    }
    catch (SocketException ex) {
    ex.printStackTrace();
    }
    catch (IOException ex1) {
    ex1.printStackTrace();
    }
    } public static void send() {
    try {
    DatagramSocket ds = new DatagramSocket();
    String str = "Hello,I'm closewbq";
    DatagramPacket dp = new DatagramPacket(str.getBytes(),
    str.length(),
    InetAddress.getByName("localhost"),
    8585);
    ds.send(dp);
    byte[] buf = new byte[100];
    DatagramPacket dpRecv = new DatagramPacket(buf, 100);
    ds.receive(dpRecv);
    System.out.println(new String(buf, 0, dpRecv.getLength()));
    ds.close();
    flag=true;
    }
    catch (SocketException ex) {
                         ex.printStackTrace(); }
    catch (IOException ex1) {
    ex1.printStackTrace();
    }
    }
      

  3.   

    DatagramSocket datagramSocket = new DatagramSocket(port);   
    就行了吧?
      

  4.   

    public static void main(String[] args) {
            Integer port = 11012;
            byte[] buffer = new byte[2048];
            try {
                DatagramSocket datagramSocket = new DatagramSocket(port);
                DatagramPacket datagramPacket = new DatagramPacket(buffer,
                        buffer.length);
                try {
                    for (;;) {
                        System.out.println("begin receive data....");
                        datagramSocket.receive(datagramPacket);
                        System.out.println(datagramPacket.getAddress().getAddress().toString()+"======="+new String(datagramPacket.getData()));
                        datagramPacket.setLength(datagramPacket.getData().toString().length());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (SocketException e) {
                e.printStackTrace();
            }    }
      

  5.   

    我刚才把IP去掉之后,程序启动的确没报错误,但是收不到服务端的数据。这样估计会有问题,应该需要指定服务端IP。
      

  6.   


    我也就很奇怪了,是不是不能用数据报套接字呀,得用TCP/IP的SOCKET才可以呀。
    不清楚这两者有何明现的区别。
      

  7.   

    public static void main(String args[]) throws UnknownHostException{
      //InetAddress ip =InetAddress.getByName("10.11.1.22";
      //System.out.println(ip);
      try {
      ds =new DatagramSocket(ClientPort);
      while(true){
      ds.receive(new DatagramPacket(buff,buff.length));
      System.out.println("客户端收到了服务端的信息:"+new String(buff,0,buff.length));
      }
      } catch (SocketException e) {
      e.printStackTrace();
      }catch(IOException e){
      e.printStackTrace();
      }
      }  
    这是修改之后的代码,有问题吗?
      

  8.   

    你的程序在我本地是能收包的ds =new DatagramSocket(ClientPort);
    你这个ClientPort确定要和发送端端口一致,贴发送端的出来看看TCP有连接开销大,UDP一个没连接速度快
    所以UDP只管照着一个端口发包,掉不掉包的咱就不管了