我是初学者,还在自学中,学习到UDP协议,自己写了端代码,不知道怎么的处理不了客户端的信息,请大家帮忙指点一下,3Q
import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 
 
 public class UDPServer {
 
  /**
   * @param args
   */
  public static void main(String[] args) {
  DatagramSocket ds=null;
  DatagramPacket receive;
  byte[] b=new byte[1024];
  int port=10000;
  try{
  ds=new DatagramSocket(port);
  receive=new DatagramPacket(b,b.length);
  while(true){
  ds.receive(receive);
  new UDPServerThread(receive);
  }
 
  }catch(Exception e){
 
  }finally{
  try{
  ds.close();
  }catch(Exception e1){}
  }
  }
 }import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 
 
 public class UDPServerThread extends Thread{
  DatagramSocket ds=null;
  DatagramPacket receive,send;
  public UDPServerThread(DatagramPacket receive){
  this.receive=receive;
  start();
  }
  public void run(){
  byte[] b=receive.getData();
  int len=receive.getLength();
  System.out.println("接收到客户端数据:"+new String(b,0,len));
 
 
  byte[] b1="OK!".getBytes();
  send=new DatagramPacket(b1,b1.length,receive.getAddress(),receive.getPort());
  try {
  ds=new DatagramSocket();
  ds.send(send);
  } catch (Exception e) {
 
  }finally{
  try{
  ds.close();
  }catch(Exception e1){}
  }
  }
 }
 
我用System.out.println(“”);方式测试了一下,启动客户端程序后,服务端运行到线程的run方法就卡住了,byte[] b=receive.getData();被阻塞了,不知道什么原因UDPJAVA服务端多线程

解决方案 »

  1.   

    客户端:package com.briup.ch12;import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;public class UDPClient {
    public static void main(String[] args){
    DatagramSocket socket = null;
    DatagramPacket sendPacket = null;
    DatagramPacket receivePacket = null;
    try{
    // 1,创建DatagramSocket
    socket = new DatagramSocket();
    // 2,创建发送用的packet
    byte[] buff = 
    "please give me your time :"
    .getBytes("UTF-8");
    sendPacket = new DatagramPacket
             (buff,buff.length,
              new InetSocketAddress(
              "localhost",9900));
    // 3,利用socket以及DatagramPacket发送数据
    socket.send(sendPacket);


    // 4,创建接收用的packet
    byte[] buffRe = new byte[20];
    receivePacket = 
    new DatagramPacket(buffRe,buffRe.length);
    //5,利用socket以及DatagramPacket接收数据
    socket.receive(receivePacket);
    System.out.println(new String(buffRe));
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    try{
    // 6,关闭socket
    if(socket!=null)socket.close();
    }catch(Exception e){}
    }
    }
    }服务端package com.briup.ch12;import java.net.DatagramPacket;
    import java.net.DatagramSocket;import java.util.Date;public class UDPServer {
    public static void main(String[] args){
    DatagramSocket socket = null;
    DatagramPacket sendPacket = null;
    DatagramPacket receivePacket = null;

    try{
    // 1,创建DatagramSocket
    socket = new DatagramSocket(9900);
    while(true){
    // 2,创建接收用的packet
    byte[] buffRe = new byte[40];
    receivePacket = 
    new DatagramPacket(buffRe,buffRe.length);
    //3,利用socket以及DatagramPacket接收数据
    socket.receive(receivePacket);
    System.out.println(new String(buffRe));


    // 4,创建发送用的packet
    byte[] buff = 
    new Date().toString()
    .getBytes();
    // 5, 获得客户端的信息,并包装
    sendPacket = new DatagramPacket
         (buff,buff.length,
            receivePacket.getSocketAddress());
    // 6,利用socket以及DatagramPacket发送数据
    socket.send(sendPacket);
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }你的例子我因为时间原因没怎么看,但是感觉和我以前的写的一个挺像的,你找找区别吧、、
      

  2.   

    你的线程都没启动,怎么去处理东西,改成下面这样吧。 while(true){
                  System.out.println("receive----");
                     ds.receive(receive);
                     System.out.println(receive);
                     new UDPServerThread(receive).start();
                 }
      

  3.   

    谢谢了,线程启动了的,STRAT写在线程的构造方法里面
    已经解决了,把receive=new DatagramPacket(b,b.length);移动到while循环里面就没问题了,但是为什么呢?
      

  4.   

    这样就没问题了,但是为什么呢?
    while(true){
      receive=new DatagramPacket(b,b.length);
      ds.receive(receive);
      new UDPServerThread(receive);
      }