import java.net.*;
public class MainClass4
{
  public static void main(String[] args)
  {
     PacketSender ps=new PacketSender();
     PacketReceiver pc=new PacketReceiver();
     
  }
}
class PacketReceiver {
  public static void main(String[] args) throws Exception {
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    DatagramSocket socket = new DatagramSocket(5002);
    socket.receive(packet);
    System.out.println(packet.getSocketAddress());
    System.out.println(new String(packet.getData(),0,packet.getLength()));
    socket.close();
  }
}class PacketSender {  public static void main(String[] args) throws Exception {
    byte[] buffer = "data".getBytes();
    InetAddress addr=InetAddress.getByName("localhost");
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, 5002);
    DatagramSocket socket = new DatagramSocket();
    socket.send(packet);
    socket.close();
  }
}
不知道我对UDP的理解哪里错了,上面这段程序编译没问题,运行什么都不输出就结束了,UDP不是面对连接的通信,也就是说PacketSender ps=new PacketSender();执行完后这个send socket关闭连接,但是数据是发送出去了呀,然后执行PacketReceiver pc=new PacketReceiver();应该能收到数据吧,总之现在的问题就是啥都不输出,请帮忙看看,谢谢了。

解决方案 »

  1.   

    先打开server,在打开client端,服务端要先开着吧
    比如
    PacketReceiver pc=new PacketReceiver();
    Thread.sleep(2000);//try catch,等待服务端完全开启
    PacketSender ps=new PacketSender();
    试一试
      

  2.   

    应该是服务器代码中new String()这里写错了,你在试试看。
    //System.out.println(packet.getAddress().getHostAddress());
    System.out.println(packet.getAddress().getHostAddress()+":"+new String(buffer,0,packet.getLength()));//输出:127.0.0.1:data
      

  3.   

    昨天我好好看了下这段程序,原来问题发生在线程方面,首先,我把PacketReceiver的接收端代码和PacketSender的发送代码写道了main()函数里面,这样,在MainClass4对PacketSender初始化完成并不执行发送代码,而是直接又去初始化PacketReceiver,然后直接跳出程序。程序结束。这个代码里面只有一个主线程。
    故我改写了代码:
    import java.net.*;
    public class MainClass4
    {
      public static void main(String[] args) throws Exception
      {
         PacketSender ps=new PacketSender();
         PacketReceiver pc=new PacketReceiver();
         
      }
    }
    class PacketReceiver {
      public PacketReceiver()throws Exception{
        System.out.println("receive start");
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        DatagramSocket socket = new DatagramSocket(5002);
        socket.receive(packet);
        System.out.println(packet.getSocketAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        socket.close();
        System.out.println("receive over");
      }
    }class PacketSender {  public PacketSender() throws Exception{
        System.out.println("sender start");
        byte[] buffer = "data".getBytes();
        InetAddress addr=InetAddress.getByName("localhost");
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, 5002);
        DatagramSocket socket = new DatagramSocket();
        socket.send(packet);
        socket.close();
        System.out.println("sender over");
      }
    }运行结果:
    sender start
    sender over
    receive start而这样写了代码之后,确实能确保发送代码和接受代码被执行,但是问题还是出来了,这里还是只有一个线程,在发送端发送完成后接受端代码才执行,这样就如您所说,必须先执行服务器端代码(接收代码),然后执行客户端代码。而我的程序是先执行了客户端,再执行了服务器端。我改了顺序后,代码如下:
    import java.net.*;
    public class MainClass4
    {
      public static void main(String[] args) throws Exception
      {
         
         PacketReceiver pc=new PacketReceiver();
         PacketSender ps=new PacketSender();
         
      }
    }
    class PacketReceiver {
      public PacketReceiver()throws Exception{
        System.out.println("receive start");
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        DatagramSocket socket = new DatagramSocket(5002);
        socket.receive(packet);
        System.out.println(packet.getSocketAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        socket.close();
        System.out.println("receive over");
      }
    }class PacketSender {  public PacketSender() throws Exception{
        System.out.println("sender start");
        byte[] buffer = "data".getBytes();
        InetAddress addr=InetAddress.getByName("localhost");
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, 5002);
        DatagramSocket socket = new DatagramSocket();
        socket.send(packet);
        socket.close();
        System.out.println("sender over");
      }
    }运行结果:receive start结果程序卡在接收端代码:
      socket.receive(packet);
    因为没有收到数据包,receive()方法阻塞,这个程序的问题仍旧是单线程的问题。
    所以,这段程序要么分开成两部分,一部分为服务器端代码,单独执行,另一部分为客户端代码,单独执行。要么就必须使用多线程了。总结:UDP通信时,数据接收端必须先执行进行接收数据。(不知道我上面说的对不对,希望指正)
    另外谢谢你的指点。
      

  4.   

    不是这个问题, System.out.println(new String(packet.getData(),0,packet.getLength()));

     System.out.println(new String(buffer,0,packet.getLength()));
    的效果是一样的,本身packet.getData()与buffer是等价的。
      

  5.   

    你分析的很有道理。如果分成两个线程就不会出现卡在 socket.receive(packet);而不往下执行的尴尬。非常抱歉,考虑问题没周全。