简介 目录 评价 推荐
  • qq_慕移动8436552 2021-05-12
    app开发实现

    UDP的Java支持

    UDP协议提供的服务不同于TCP协议的端到端服务,它是面向非连接的,属不可靠协议,UDP套接字在使用前不需要进行连接。实际上,UDP协议只实现了两个功能:

    1)在IP协议的基础上添加了端口;

    2)对传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。


    Java通过DatagramPacket类和DatagramSocket类来使用UDP套接字,客户端和服务器端都通过DatagramSocket的send()方法和receive()方法来发送和接收数据,用DatagramPacket来包装需要发送或者接收到的数据。发送信息时,Java创建一个包含待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket实例的send()方法;接收信息时,Java程序首先创建一个DatagramPacket实例,该实例预先分配了一些空间,并将接收到的信息存放在该空间中,然后把该实例作为参数传递给DatagramSocket实例的receive()方法。在创建DatagramPacket实例时,要注意:如果该实例用来包装待接收的数据,则不指定数据来源的远程主机和端口,只需指定一个缓存数据的byte数组即可(在调用receive()方法接收到数据后,源地址和端口等信息会自动包含在DatagramPacket实例中),而如果该实例用来包装待发送的数据,则要指定要发送到的目的主机和端口。


    UDP的通信建立的步骤

    UDP客户端首先向被动等待联系的服务器发送一个数据报文。一个典型的UDP客户端要经过下面三步操作:

    1. 创建一个DatagramSocket实例,可以有选择地对本地地址和端口号进行设置,如果设置了端口号,则客户端会在该端口号上监听从服务器端发送来的数据;

    2. 使用DatagramSocket实例的send()和receive()方法来发送和接收DatagramPacket实例,进行通信;

    3. 通信完成后,调用DatagramSocket实例的close()方法来关闭该套接字。

    由于UDP是无连接的,因此UDP服务端不需要等待客户端的请求以建立连接。另外,UDP服务器为所有通信使用同一套接字,这点与TCP服务器不同,TCP服务器则为每个成功返回的accept()方法创建一个新的套接字。一个典型的UDP服务端要经过下面三步操作:

    1. 创建一个DatagramSocket实例,指定本地端口号,并可以有选择地指定本地地址,此时,服务器已经准备好从任何客户端接收数据报文;

    2. 使用DatagramSocket实例的receive()方法接收一个DatagramPacket实例,当receive()方法返回时,数据报文就包含了客户端的地址,这样就知道了回复信息应该发送到什么地方;

    3. 使用DatagramSocket实例的send()方法向服务器端返回DatagramPacket实例。


    一个程序为服务端,建立UDP服务端套接字。

    1

    java源程序如下:


    import java.io.IOException;//导入IOException类

    import java.net.DatagramPacket;//导入DatagramPacket类

    import java.net.DatagramSocket;//导DatagramSocket入

    import java.net.InetAddress;//导入InetAddress类

    import java.util.Scanner;//导入Scanner类

    /*

     * 客户端

     */

    public class UDPClient {//公共类

        public static void main(String[] args) throws IOException {//主程序入口

            /*

             * 向服务器端发送数据

             */      

            InetAddress address = InetAddress.getByName("localhost"); // 1.定义服务器的地址、端口号、数据

            int port = 8800;//定义端口类型

           while(true) {//通过循环不同的向客户端发送和接受数据

            Scanner scanner = new Scanner(System.in);//从键盘接受数据

            String send = scanner.nextLine();//nextLine方式接受字符串

            byte[] data = send.getBytes();//将接收到的数据变成字节数组      

            DatagramPacket packet = new DatagramPacket(data, data.length, address, port);//2.创建数据报,包含发送的数据信息     

            DatagramSocket socket = new DatagramSocket(); // 3.创建DatagramSocket对象       

            socket.send(packet);// 4.向服务器端发送数据报


            /*

             * 接收服务器端响应的数据

             */      

            byte[] data2 = new byte[1024];//创建字节数组 

            DatagramPacket packet2 = new DatagramPacket(data2, data2.length);// 1.创建数据报,用于接收服务器端响应的数据          

            socket.receive(packet2);// 2.接收服务器响应的数据

            //3.读取数据

            String reply = new String(data2, 0, packet2.getLength());//创建字符串对象

            System.out.println("我是客户端,服务器说:" + reply);//输出提示信息

            socket.close();//4.关闭资源

           }

        }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    另外一个程序为客户端,建立UDP客户端套接字。

    java源程序如下:


    import java.io.IOException;//导入IOException类

    import java.net.DatagramPacket;//导入DatagramPacket类

    import java.net.DatagramSocket;//导入DatagramSocket类

    import java.net.InetAddress;//导入InetAddress类

    import java.util.Scanner;//导入Scanner类


    /*

     * 服务器端,实现基于UDP的用户登陆

     */

    public class UDPServer {//公共类

        public static void main(String[] args) throws IOException {//主程序入口

            /*

             * 接收客户端发送的数据

             */      

            DatagramSocket socket = new DatagramSocket(8800);  // 1.创建服务器端DatagramSocket,指定端口

            // 2.创建数据报,用于接收客户端发送的数据

            byte[] data = new byte[1024];//创建字节数组,指定接收的数据包的大小

            DatagramPacket packet = new DatagramPacket(data, data.length);


            // 3.接收客户端发送的数据

            System.out.println("****服务器端已经启动,等待客户端发送数据");//输出提示信息

           while(true) {//通过循环不停的向客户端发送数据和接收数据

            socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞

            // 4.读取数据 

            String info = new String(data, 0, packet.getLength());//创建字符串对象

            System.out.println("我是服务器,客户端说:" + info);//输出提示信息    


            /*

             * 向客户端响应数据

             */

            // 1.定义客户端的地址、端口号、数据    

            InetAddress address = packet.getAddress();//获取发送端的地址

            int port = packet.getPort();//获取 发送端进程所绑定的端口  

            Scanner scanner = new Scanner(System.in);//从键盘接受数据  

            String send = scanner.nextLine();//nextLine方式接受字符串  

            byte[] data2 = send.getBytes();//将接收到的数据转换为字节数组

            DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port);// 2.创建数据报,包含响应的数据信息      

            socket.send(packet2); // 3.响应客户端  

           } 


        }

    }

    ————————————————

    版权声明:本文为CSDN博主「qq_41182503」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/qq_41182503/article/details/80179961


    1回答·651浏览
  • HuangYHY 2019-05-04
    有程序demo吗?

    没有啊

    2回答·988浏览
  • 沁涵 2019-02-10
    socket的组成

    socket用于描述IP地址和端口号

    1回答·1577浏览
  • 珂玮 2018-11-21
    视频中说网线属于物理层,是不是不恰当?

    看得见,接触得到,都可以视为物理层

    1回答·3229浏览
  • 一生明阳 2018-07-15
    不应该是TCP/IP七层协议吗,为什么老师讲的只有五层

    OSI是七层,TCP/IP是五层,你需要看看数据通信基础

    2回答·1610浏览
  • freehappy 2017-10-29
    端口号会不会不够用?

    记得自己能使用的端口只有1千多,后面的都用不了

    3回答·2286浏览
  • 慕粉13557878578 2017-10-26
    老师能给分享一下MYeclipse的安装包吗?下载的要付费

    可以去下载个注册机的 网上应该都有

    1回答·588浏览
  • 慕容1147679 2017-09-09
    问一个与课程无关的问题,请问老师讲课的课件是用PPT做的吗?

    应该是的,屏幕下面任务栏里有个PPT的图标,视频里的动画啥的都是后期做的特效

    1回答·937浏览
  • 慕侠0844227 2017-04-16
    什么是socket
    已采纳 田心枫 的回答

    它就是一个函数库,里面包括大量的函数和相应的数据结构,已经实现好了。 它支持网络通信。 程序开发人员可以通过阅读相关的函数文档,了解函数的使用方法,进行网络的编程。 两种形式的socket:流式套接字,对应与TCP协议。

    2回答·1008浏览
  • 幕布斯7550068 2017-02-07
    Socket是属于5层数据模型中的那一层呢?

    传输层

    1回答·3901浏览
  • weibo_请叫我楠霸天_0 2016-03-21
    每台机器的唯一标识不应该是MAC地址吗?

    从最底层,MAC地址是固化在网卡中的链路层地址,又叫MAC地址,是不能唯一识别这个网卡的,如果计算机只有一个网卡,那么它就可以唯一标识这台计算机

    4回答·3327浏览
  • IT大侠008 2015-12-15
    Firefox 无法建立到 ws://localhost:8000/ 服务器的连接

    把tomcat.js去掉,部署到tomcat冲突了

    6回答·13907浏览
  • 不朽Terry 2015-12-07
    视频下载问题

    http://img.mukewang.com/57026bbe000179fc08950154.jpg  使用插件下载

    2回答·361浏览
  • 琳小白 2015-10-11
    哪里可以找到《探索Linux的网络世界》

    Linux网络管理,

    也可以叫

    探索Linux的网络世界,

    不废话,看图

    http://img.mukewang.com/57b3ba0b00014f4713660667.jpg

    2回答·1810浏览
  • 天才JC 2015-08-13
    网页视频快进问题

    只能以1.25、1.75、2.0的速度来看,没有1.5那么选项

    2回答·2209浏览
  • phoooob 2015-05-06
    应用程序的端口号是自定义的,那么有没有可能两个应用程序自定义的端口号相同?是怎么规避这种问题的呢?

    IP地址+协议+端口号,来唯一的确定应用程序使用的端口,一般不会相同,如果相同肯定是不行的

    3回答·4453浏览
  • 调皮的魔法少女李狗蛋儿 2015-04-04
    我想问一下- -
    已采纳 汤小洋 的回答

    本课程是socket网络通信的基础课程,是实现网络通信的基础内容

    1回答·1372浏览
  • CoderTerry 2015-02-28
    关于演示的动画

    用的是金山的WPS演示。这里有两个网址,你可以参考一下。

    http://www.wps.cn/product/beta/
    http://bbs.wps.cn/forum.php?mod=viewthread&tid=22449343


    1回答·735浏览
  • 安sir 2015-02-05
    程里面的源代码分享?

    案例讲解的章节都有,不过还是建议你先看视频,认真学习自己练习,出错或者没思路了再看源码

    1回答·1118浏览
  • cq2014 2014-11-04

    是的,但是老师好像讲错了

    2回答·1017浏览
  • sunshineblue 2014-11-04

    用的是金山的WPS演示。这里有两个网址,你可以参考一下。

    1

    2

       

    http://www.wps.cn/product/beta/

    http://bbs.wps.cn/forum.php?mod=viewthread&tid=22449343


       


    2回答·931浏览
  • Kinghiram_Zhang 2014-11-02
    4回答·685浏览
  • 慕尼黑3043975 2014-10-19
    2回答·859浏览
  • kliosvseyy 2014-10-13

    TCP/IP是一个协议栈,包含许多协议,细分的话,其中的IP协议是属于网络层的,TCP和UDP属于传输层

    5回答·1228浏览
  • 水蓝诱惑 2014-10-08
    2回答·852浏览
  • 张海威 2014-09-29
    1回答·681浏览
  • 我是谁_0007 2014-09-29
    0回答·711浏览
  • JiaZombie 2014-09-28
    4回答·849浏览
  • 夏雪忆冬_0001 2014-09-26

    已经调整啦,继续关注哦

    1回答·882浏览
  • JinBill 2014-09-25
    1回答·987浏览
数据加载中...
开始学习 免费