java UDP 操作 DatagramSocket 类 要收发DatagramPacket必须打开一个数据报socket ,当服务器构造DatagramSocket时。 服务器和客户端的服务器 两者使用的socket都是一样的,区别仅仅在于 服务器端的端口是已知端口,而客户端的端口是系统分配的。 TCP端口和UDP端口之间没有关联,所以两者可以共同绑定在同一个端口上,而不会有相互影响。 DatagramSocket 类的构造函数 DatagramSocket创建一个在指定端口监听的入站数据报的 socket ,使用此构造函数可以编写出在指导的端口监听的服务器。 如果服务器在匿名端口监听,客户端就无法与之联系。 DatagramSocket 中的receive 方法,是阻塞方法,只有当接收到数据的时候,才会进行下面的代码,否则只会阻塞当前的进程。 一个简单的UDP 客户端 客户端接收用户在控制台上的输入,然后调用 DatagramSocket 中的send方法, 将数据传递出去。 UDP服务器 每当接收到一个数据报的时候,packet需要设置成最大的可能的值,否则当接收多个数据报以后,packet的值会变成已经接收到的最小的值。 一个在能够在控制台发送和接收的小程序: 发送数据: package datagram.test; import java.net.*; import java.io.*; public class DatagramSender extends Thread { public DatagramSender(){ start(); } public void run(){ DatagramSocket dSocket = null; DatagramPacket dPacket = null; BufferedReader br = null; try { dSocket = new DatagramSocket(); Br = new BufferedReader(new InputStreamReader(System.in)); InetAddress ia = InetAddress.getByName("localhost"); while(true){ System.out.println("我是Sender,请输入要发送的信息:"); String info = br.readLine(); byte[] b = info.getBytes("UTF-8"); dPacket = new DatagramPacket(b,b.length,ia,3000); dSocket.send(dPacket); if(info.equals("goodbye")){ System.out.println("我是Sender,我走了,真的"); break; } } } catch (SocketException e) { e.printStackTrace(); }catch(IOException ioe){ ioe.printStackTrace(); }finally{ dPacket = null; if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(dSocket != null){ dSocket.close(); } } } public static void main(String[] args) { new DatagramSender(); } } 接收数据: package datagram.test; import java.io.*; import java.net.*; public class DatagramReceiver extends Thread { public DatagramReceiver(){ start(); } public void run(){ DatagramSocket dSocket = null; DatagramPacket dPacket = null; try{ dSocket = new DatagramSocket(3000); byte buf[] = new byte[2048]; dPacket = new DatagramPacket(buf, buf.length); System.out.println("我是Receiver,我已经准备好接收啦。"); while(true){ dSocket.receive(dPacket); //阻塞语句 byte[] b = dPacket.getData(); String info = new String(b, 0,dPacket.getLength(), "UTF-8"); System.out.println("我是Receiver: " + info); if(info.equals("goodbye")){ System.out.println("你跟我goodbye,我就跟你也goodbye"); break; } } }catch (SocketException e) { e.printStackTrace(); }catch(IOException ioe){ ioe.printStackTrace(); }finally{ dPacket = null; if(dSocket != null){ dSocket.close(); } } } public static void main(String[] args) { new DatagramReceiver(); } }