简介 目录 评价 推荐
  • 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回答·586浏览
  • maxtas 2021-03-17
    为什么产生no protocol

    URL 包含访问方式【协议】: 资源位置两部分,www.baidu.com缺少了访问协议

    2回答·661浏览
  • 慕村3124171 2020-08-15
    多线程UDP通信,报空指针异常,拜托大家帮忙看下问题出在哪

    我只看出来了UDPServer的socket应该放到while循环外面创建,其他的没发现什么问题 

    1回答·845浏览
  • 慕村3124171 2020-08-15
    使用printwriter的含自动刷新缓冲区的构造方法时,没有产生输出,为什么

    缓冲区要调用 flush() 方法才能输出

    1回答·802浏览
  • qq_慕丝8116306 2020-03-16
    将数据发送到服务器

    getData()方法返回与数据报文相关联的字节数组。实际返回的是对与DatagramPacket最近关联的字节数组的一个引用,而关联则是通过构造函数或setData()方法形成。返回的缓存数组的长度可能比数据报文内部长度更长,因此,必须使用内部长度和偏移量来指定实际接收到的信息。

    setData()方法指定一个字节数组作为该数据报文的数据部分。第一种形式将整个字节数组作为缓冲区;第二种形式把字节数组中,从offset到offset+length-1的部分作为缓存区。每次调用第二种形式的setData()方法,都将更新数据的内部偏移量和长度。

    1回答·912浏览
  • 慕娘9172889 2020-02-29
    Java如何实现与公网连接服务器连
    0回答·829浏览
  • qq_慕函数1127845 2020-02-09
    while死循环中的算法问题

    资源浪费问题可以留给jvm的垃圾处理机制解决就可以了吧。你做的那个if判断没什么实际意义吧。

    1回答·1050浏览
  • 棨优 2019-10-01
    网络通信对话

    你说的是想在控制台上交互,控制输出的信息么?

    1回答·944浏览
  • 棨优 2019-10-01
    网络通信聊天对话

    控制台一般是看打印信息的,你想在控制台输入可以用scanner

    1回答·911浏览
  • Code_King 2019-09-18
    有Java webSocket案例吗?
    0回答·738浏览
  • 失焦 2019-09-05
    socket、servlet和监听器的区别与联系
    0回答·585浏览
  • 冰断秋 2019-07-30
    在使用多线程实现基于UDP的多客户端与服务端连接时,发现有时候客户端可能会收不到服务端的回应?

    这是不是因为UDP协议是无连接、不可靠的原因?

    1回答·1242浏览
  • 慕沐6598592 2019-06-04
    SQL Server文件的数据类型是什么?
    已采纳 weibo_子非三宁_0 的回答

    可以用image代替 ,2008还可以用varbinary(MAX)

    Sql里可以存文件的类型,和My sql 或 oracle的blob类型没啥区别的

    1回答·1691浏览
  • 我爱孙佳怡 2019-05-22
    类.方法得到的是什么东西

    类.方法表示类调用类中的静态方法,静态方法的调用是不需要使用对象的实例调用,直接使用类名.方法来使用。

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

    没有啊

    2回答·934浏览
  • sureball 2019-05-03
    请教一个关于服务器端只用给客户端发消息,不用管客户端是否恢复(硬件)
    1回答·954浏览
  • qq_慕函数8474026 2019-04-05
    问题找不到啊,代码没问题啊,一运行客户端就出问题,大佬求解

    线程类的第54行,判断语句后面怎么能加分号呢

    4回答·1113浏览
  • qq_愿_20 2019-03-09
    为啥我client 一直在输出内容

    是不是把 Socket socket = serverSocket.accept();  这行代码 写在while循环外面了

    1回答·1062浏览
  • qq_Rain雨因_inVX07 2019-03-05
    ping failed mysql数据库连接失败

    是否加载了驱动?

    1回答·1849浏览
  • 慕虎0571853 2019-03-02
    em。。多线程课程不是在这个网络通讯课程之后吗。。。

    建议先看多线程哦,但是如果不学多线程的话,我感觉影响不是很大

    1回答·1033浏览
  • 慕虎0571853 2019-03-01
    代码没问题为啥会出现地址已被使用异常
    4回答·1210浏览
  • 慕虎0571853 2019-02-28
    请问各位大佬零基础跟着java工程师路径走到现在,对http等什么东东的一点都不了解

    基础还是得学的,不然后期知其然而不知其所以然。会用,但不明白为什么这么用,不懂底层原理。

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

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

    1回答·1512浏览
  • 幕布斯9176636 2019-02-07
    同样的代码为什么我的报异常了

    ServerThread类中  //获取输入流

    import org.omg.CORBA.portable.InputStream;你要导入IO流的包;

    客户端中,Socket socket=new Socket(InetAddress.getLocalHost(),7001);将InetAdress.getLocalHost()直接写成"IP"这种就行了,IP是你自己的IP地址。

    另外是先启动服务端,如果服务端没有启动的话,启动客户端会报错

     br.close();
       is.close();
       pw.close();
       os.close();
       socket.close();   如果多个流连接在一起,直接关闭最终的流就可以了;br.close();os.close();socket.close();

    1回答·1170浏览
  • MEI有头绪 2019-01-05
    请问一下没有demo源代码嘛?

    他这里应该没有,什么东西都要多练,练多了你就感觉做这些太简单了,自己就能很快写一个,不需要下载别人的

    1回答·1169浏览
  • qq_一曲离殇丶笑看人世繁华_3 2018-12-26
    为什么无法连接另一台计算机

    把两台电脑的防火墙都关掉就可以了

    2回答·1089浏览
  • 南风谨 2018-11-26
    为什么我的客户端一启动,服务器就关闭了

    emmm  写错了一个语句  看来还是要细心

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

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

    1回答·3185浏览
  • qq__粉色的小海星_0 2018-11-17
    客户端输出的语句 汉字变为乱码了怎么回事啊,
    已采纳 Hnustyanfjieyu 的回答

    可能是客户端与服务端的编码不一致导致的,客服端接收信息的时候,将byte数组转换为Strin类型的时候进行编码,gbk或者utf-8,可以试试。

    1回答·1420浏览
  • 慕粉7419830 2018-11-01
    输出的顺序不理解

    建议去看看多线程方面的知识,这个输出的顺序和写在外面的代码顺序是没有关系的,调用了start方法只是表明有一个新的线程开始工作了,并不代表原来的线程会暂停工作,多次运行输出的顺序有时候可能是不一样的。

    学过多线程你就知道咋回事了。

    1回答·1038浏览
数据加载中...
开始学习 免费