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