UDP是国际标准化组织为互联网设定的标准中的传输层中的一个协议。TCP/IP协议簇是一个很庞大的家族,但是今天我们就来看一看这个面向无连接的传输层在Java中是怎样通过编程实现的。


原理性知识

在Java中编写基于UDP协议的应用是最简单不过的了,我们只需要按照这几个特定的步骤就可以完成了。因为在Java中,已经将底层的协议信息全部封装了起来,对我们这些在应用层上的开发人员来说是透明的。通过API中给出的接口,我们可以轻松的开发出一款简单的小应用。

实现的流程

从逻辑上来说,如下图:

表现在代码上,可以这样做(因为是找的图,端口貌似不正确,请见谅):

编码实现一下:

我们先从客户端开始吧。

package tcp.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client {

    public static void main(String[] args) {
        try {
            //创建一个“发射器”,相当于快递员,将我们的“DatagramPacket”发和收
            DatagramSocket socket = new DatagramSocket();
            //一个字节数组,作为传输过程中的容器,将数据一个字节一个字节的发和收
            byte[] buf = "Hello Server ! I am Client!".getBytes();
            //我们的包裹,包含目的地和端口还有我们的数据
            DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000);
            //让快递员发出我们的包裹,剩下的事情,就交给底层来实现了
            socket.send(sendPacket);

            //创建一个我们将要接收的包裹
            DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
            //从快递员那里收到一个包裹。这个方法会阻塞哦。(也就是说,在特定的时间内没有收到包裹,我们会一直等下去。过期的话,才会离开,即不阻塞)
            socket.receive(receivePacket);
            //将接收到的字节转换成字符串,方便打印到控制台上
            String recvStr = new String(receivePacket.getData(), 0, receivePacket.getLength());
            //打印出接收到的数据信息
            System.out.println("服务器端传来的消息是: " + recvStr);

            //关闭套接字,快递员下班咯
            socket.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

下面轮到我们的服务器端了。

package tcp.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {

    public static void main(String[] args) throws Exception {

        //快递员上班了,他在10000端口等着为我们服务
        DatagramSocket socket = new DatagramSocket(10000);

        //创建一个带缓冲的字节数组
        byte[] buf = new byte[1024];

        //创建一个具有一定容量的包裹
        DatagramPacket recvPacket = new DatagramPacket(buf, buf.length);
        //从快递公司(也就是我们的网络的底层)接收到我们的包裹
        socket.receive(recvPacket);
        //将接收到的数据转换成字符串,方便打印
        String recvStr = new String(recvPacket.getData(),0,recvPacket.getLength());
        //打印出接收到的数据
        System.out.println("收到的来自客户端的消息是: " + recvStr);

        //这里是我们想要发送的包裹的里面的内容。要一个字节一个字节的叠好(就像包裹内一个个的衣服一样)
        buf = "Hello Client,I am your server!".getBytes();
        //包裹一下,准备投递咯,我们可以从刚才的寄件人哪里找到发送的目的地和目的端口,也即是我们要回复的人的姓名和住址呗
        DatagramPacket sendPacket = new DatagramPacket(buf,buf.length,recvPacket.getAddress(),recvPacket.getPort());

        //让快递员帮我们投递包裹,发出包
        socket.send(sendPacket);
        //快递员下班了,套接字要进行关闭
        socket.close();
    }

}

注意事项

  • 对于服务器端和客户端:

    这里面没有什么特别的需要注意的。就是一些顺序问题。当然了,这里如果我们可以将这个案例附着到实际的生活中,很容易的就可以理解了。想象一下这样的场景,邮局不开门,你能投递包裹吗?不能吧,所以要想投递包裹,前提就是邮局开门,也就是服务器端要先运行。

  • 对于服务器端内部:

    还是这个想法,现在邮局想给我们转发信件,要是我们不知道目的地,我们该往哪里发?所以邮局必须要知道你要发送的目的地等详细信息。而这些在代码中,不正是要先收一下packet,才能找到这些信息的吗?所以,服务器端要先收包,然后才能发包。

  • 对于客户端内部:

    类比于服务器端内部,当然是对称着进行咯。我们发了他才能收嘛。所以对于客户端而言,正好和服务器端是镜像对称的,要先发后收packet。

总结与展望

对于这个案例,想必通过我这样一种通俗的解释你已经是理解了吧。但是对于UDP的开发而言,有很多的变种,在实际的开发过程中,有很多很多的不一样的实现方式。但是这里的理念永远不会过时滴,就放心的用吧。

对于UDP,我的下一个小案例,就是让服务器端和客户端互动起来,实现一个类似于“剪刀石头布”的小游戏。敬请期待哦。

没想到你是这样的UDP的更多相关文章

  1. 在做关于NIO TCP编程小案例时遇到无法监听write的问题,没想到只是我的if语句的位置放错了位置,哎,看了半天没看出来

    在做关于NIO TCP编程小案例时遇到无法监听write的问题,没想到只是我的if语句的位置放错了位置,哎,看了半天没看出来 贴下课堂笔记: 在Java中使用NIO进行网络TCP套接字编程主要以下几个 ...

  2. centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多!

    centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多! 一.手动安装 1.下载(官网)    cd /soft     wget http://www.clam ...

  3. 【原创】这道Java基础题真的有坑!我也没想到还有续集。

    前情回顾 自从我上次发了<这道Java基础题真的有坑!我求求你,认真思考后再回答.>这篇文章后.我通过这样的一个行文结构: 解析了小马哥出的这道题,让大家明白了这题的坑在哪里,这题背后隐藏 ...

  4. 头条编程题 万万没想到之抓捕孔连顺 JavaScript

    [编程题] 万万没想到之抓捕孔连顺 时间限制:1秒 空间限制:131072K 我叫王大锤,是一名特工.我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺.和我一起行动的还有另外两名特工,我提议 ...

  5. 杀死众筹的N种方法:没想到山寨大军也参与了

    ​ ​ 众筹作为当下创业者筹集资金,将创意变为现实的最重要手段之一,正面临着越来越多的困难,甚至衍生出杀死众筹的N种方法.甚至这些方法还分为了两类,就众筹本身看,杀死它们的主要方法是:创业者卷钱跑路. ...

  6. 没想到 Google 排名第一的编程语言,为什么会这么火?

    没想到吧,Python 又拿第一了! 在 Google 公布的编程语言流行指数中,Python 依旧是全球范围内最受欢迎的技术语言!   01 为什么 Python 会这么火? 核心还是因为企业需要用 ...

  7. 字节跳动:[编程题]万万没想到之聪明的编辑 Java

    时间限制:1秒 空间限制:32768K 我叫王大锤,是一家出版社的编辑.我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误.但是,优秀的人总能在平凡的工作中发现真理.我发现 ...

  8. 没想到,Git居然有3种“后悔药”!

    没想到,Git居然有后悔药! 你知道Git版本控制系统中都有哪些"后悔药"吗? 本文通过案例讲解git reset . git revert . git checkout在版本控制 ...

  9. 万万没想到!ModelArts与AppCube组CP了

    摘要:嘘,华为云内部都不知道的秘密玩法,我悄悄告诉您! 双"魔"合璧庆双节 ↑开局一张图,故事全靠编 华为云的一站式开发平台ModelArts和应用魔方AppCube居然能玩到一起 ...

随机推荐

  1. hihocoder #1159 : 扑克牌

    描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中 ...

  2. 从零开始搭建口袋妖怪管理系统(2)-借助ngRoute实现详情页面跳转

    一.目标 上一次我们用Angular1.x完成了简单的口袋妖怪展示列表页面,现在我们想要了解口袋妖怪更多的信息,但是发现原有单行表格可能容纳不下口袋妖怪的所有信息,所以现在我们需要一个口袋妖怪详情界面 ...

  3. Nginx配置二级目录/路径 映射不同的反向代理和规避IP+端口访问

       当配置Nginx来映射不同的服务器 可以通过二级路径来反向代理 来解决一个外网端口实现多个服务访问. 配置如下: server { listen ; server_name demo.domai ...

  4. Struts中的找不到StringUtils异常

    今天在Struts2框架下使用JSON插件时,程序保存找不到类org/apache/commons/lang/xwork/StringUtils,我纳闷了,commons-lang-2.5.jar和c ...

  5. Linux文件基本操作

    TIP:Tab键可以自动补全命令 首先要了解Linux树形结构 1./- 根每一个文件和目录从根目录开始.只有root用户具有该目录下的写权限.请注意,/root是root用户的主目录,这与/.不一样 ...

  6. mysql 索引列为Null的走不走索引及null在统计时的问题

    要尽可能地把字段定义为 NOT NULL,即使应用程序无须保存 NULL(没有值),也有许多表包含了可空列(Nullable Column)这仅仅是因为它为默认选项.除非真的要保存 NULL,否则就把 ...

  7. webpack4.1.1的使用详细教程

    安装全局webpack cnpm install -g webpack 安装全局webpack-cli npm install -g webpack-cli 初始化:生成package.json文件 ...

  8. Docker配置文件

    Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor),用户可以直接使用它们来进行开发或生产部署. 模板 在 config_sample.yml 文件中,可以看到一些现成 ...

  9. springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)

    HandlerMethodArgumentResolver是用来为处理器解析参数的,主要用在HandlerMethod中,每个Resolver对应一种类型的参数,其实现类特别的多. HandlerMe ...

  10. 【事务】<查询不到同一调用方法其它事务提交的更新>解决方案

    最近遇到一个很棘手的问题,至今也解释不清楚原因,不过已经找到了解决方案. 先来看看Propagation属性的值含义,@Transactional中Propagation属性有7个选项可供选择: Pr ...