zoukankan      html  css  js  c++  java
  • 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】。

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

  • 相关阅读:
    BZOJ_2661_[BeiJing wc2012]连连看_费用流
    BZOJ_4867_[Ynoi2017]舌尖上的由乃_分块+dfs序
    BZOJ_3238_[Ahoi2013]差异_后缀自动机
    BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树
    [转载]快速幂与矩阵快速幂
    ACM的一点基础知识
    [转载]C++STL—vector的插入与删除
    C++STL—map的使用
    [转载]汇编语言assume伪指令的作用
    [转载]c++中的位运算符
  • 原文地址:https://www.cnblogs.com/albertrui/p/8399441.html
Copyright © 2011-2022 走看看