为了账号安全,请及时绑定邮箱和手机立即绑定

app开发实现

开发app的时候利用UDP协议接收数据信息如何实现,Java语言

正在回答

1 回答

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


0 回复 有任何疑惑可以回复我~

这是一个大问题,

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

app开发实现

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信