- 1 package zyb.org.UDP;
- 2 3 import java.io.IOException;
- 4 import java.io.InterruptedIOException;
- 5 import java.net.DatagramPacket;
- 6 import java.net.DatagramSocket;
- 7 import java.net.InetAddress;
- 8 9 public class UDPClient {
- 10 private static final int TIMEOUT = 5000; //设置接收数据的超时时间
- 11 private static final int MAXNUM = 5; //设置重发数据的最多次数
- 12 public static void main(String args[]) throws IOException {
- 13 String str_send = "Hello UDPserver";
- 14 byte[] buf = new byte[1024];
- 15 //客户端在9000端口监听接收到的数据
- 16 DatagramSocket ds = new DatagramSocket(9000);
- 17 InetAddress loc = InetAddress.getLocalHost();
- 18 //定义用来发送数据的DatagramPacket实例
- 19 DatagramPacket dp_send = new DatagramPacket(str_send.getBytes(), str_send.length(), loc, 3000);
- 20 //定义用来接收数据的DatagramPacket实例
- 21 DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
- 22 //数据发向本地3000端口
- 23 ds.setSoTimeout(TIMEOUT); //设置接收数据时阻塞的最长时间
- 24 int tries = 0; //重发数据的次数
- 25 boolean receivedResponse = false; //是否接收到数据的标志位
- 26 //直到接收到数据,或者重发次数达到预定值,则退出循环
- 27
- while (!receivedResponse && tries < MAXNUM) {
- 28 //发送数据
- 29 ds.send(dp_send);
- 30
- try {
- 31 //接收从服务端发送回来的数据
- 32 ds.receive(dp_receive);
- 33 //如果接收到的数据不是来自目标地址,则抛出异常
- 34
- if (!dp_receive.getAddress().equals(loc)) {
- 35
- throw new IOException("Received packet from an umknown source");
- 36
- }
- 37 //如果接收到数据。则将receivedResponse标志位改为true,从而退出循环
- 38 receivedResponse = true;
- 39
- } catch(InterruptedIOException e) {
- 40 //如果接收数据时阻塞超时,重发并减少一次重发的次数
- 41 tries += 1;
- 42 System.out.println("Time out," + (MAXNUM - tries) + " more tries...");
- 43
- }
- 44
- }
- 45
- if (receivedResponse) {
- 46 //如果收到数据,则打印出来
- 47 System.out.println("client received data from server:");
- 48 String str_receive = new String(dp_receive.getData(), 0, dp_receive.getLength()) + 49 " from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
- 50 System.out.println(str_receive);
- 51 //由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
- 52 //所以这里要将dp_receive的内部消息长度重新置为1024
- 53 dp_receive.setLength(1024);
- 54
- } else {
- 55 //如果重发MAXNUM次数据后,仍未获得服务器发送回来的数据,则打印如下信息
- 56 System.out.println("No response -- give up.");
- 57
- }
- 58 ds.close();
- 59
- }
- 60
- }
来源: http://www.bubuko.com/infodetail-1961104.html