Java网络编程之UDP

Java网络编程之UDP

一、C/S架构中UDP网络通信流程  

  ①创建DatagramSocket与DatagramPacket对象

  ②建立发送端,接收端

  ③建立数据包

  ④调用Socket的发送、接收方法

  ⑤关闭Socket

  注意:发送端与接收端是两个独立的运行程序,在接收端需要指定监听的端口

  基本的流程如下图所示

  在Java中类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
  UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
  UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

  基于java平台的UDP编程,上图改造如下:

二、示例分析

 1 package me.net.socket;
 2 
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.InetAddress;
 7 import java.net.SocketException;
 8 import java.net.UnknownHostException;
 9 
10 import org.junit.Test;
11 
12 /**
13  * UDP编程
14  * @author Administrator
15  *
16  */
17 public class TestUDP {
18 
19     /**
20      * 发送端
21      */
22     @Test
23     public void send() {
24     DatagramSocket ds = null;
25     DatagramPacket pack = null;
26     try {
27         ds = new DatagramSocket();
28         byte[] buf = "你好,我是要发送的数据".getBytes();
29         // 创建一个数据报,每个数据包都不能大于64k,都记录者信息,发送端的ip,端口号,以及接收端的ip和端口号
30         pack = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("localhost"), 9099);
31         ds.send(pack);
32     } catch (SocketException e) {
33         e.printStackTrace();
34     } catch (UnknownHostException e) {
35         e.printStackTrace();
36     } catch (IOException e) {
37         e.printStackTrace();
38     } finally {
39         if (ds != null) {
40         ds.close();
41         }
42     }
43     }
44     
45     /**
46      * 接收端
47      */
48     @Test
49     public void receive() {
50     DatagramSocket ds = null;
51     DatagramPacket pack = null;
52     try {
53         ds = new DatagramSocket(9099);
54         byte[] buf = new byte[1024];
55         pack = new DatagramPacket(buf, 0, buf.length);
56         ds.receive(pack);
57         String str = new String(pack.getData(), 0, pack.getLength());
58         System.out.println(str);
59     } catch (IOException e) {
60         e.printStackTrace();
61     } finally {
62         if (ds != null) {
63         ds.close();
64         }
65     }
66     }
67 }

如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

转载请注明出处和链接地址,欢迎转载,谢谢!

原文地址:https://www.cnblogs.com/albertrui/p/8399441.html