网络编程-UDP通信程序

Posted Dinesaw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程-UDP通信程序相关的知识,希望对你有一定的参考价值。

网络编程-UDP通信程序

InetAddress address = InetAddress.getByName("Dinesaw");
System.out.println("主机名:" + address.getHostName());
System.out.println("IP地址:" + address.getHostAddress());

UDP发送数据

  • Java中的UDP通信

    • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
  • 构造:ds是快递公司,dp是快递包裹

  • 发送数据的步骤

    • 创建发送端的Socket对象(DatagramSocket)
    • 创建数据,并把数据打包
    • 调用DatagramSocket对象的方法发送数据
    • 关闭发送端
  • 代码演示

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.nio.charset.StandardCharsets;
    
    public class sendme 
        public static void main(String[] args) throws IOException 
       
            DatagramSocket ds = new DatagramSocket();
    
            String str = "HELLO!";
            byte[] bytes =str.getBytes();
            InetAddress address = InetAddress.getByName("Dinesaw");
            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
    
            ds.send(dp);
    
            ds.close();
        
    
    
    

UDP接收数据

  • 接收数据的步骤

    • 创建接收端的Socket对象(DatagramSocket)
    • 创建一个数据包,用于接收数据
    • 调用DatagramSocket对象的方法接收数据
    • 解析数据包,并把数据在控制台显示
    • 关闭接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class saveme 
    public static void main(String[] args) throws IOException 
    
        DatagramSocket ds = new DatagramSocket(10086);
        
        //创建一个数据包,用于接收数据
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, bys.length);

        ds.receive(dp);

        System.out.println("接收到的数据是:" + new String(dp.getData(), 0,dp.getLength()));
    



UDP通信程序练习

  • 案例需求

    UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束

    UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

  • 代码实现

  • saveme

    • import java.io.IOException;
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      
      public class saveme 
          public static void main(String[] args) throws IOException 
      
              DatagramSocket ds = new DatagramSocket(10086);
      
              while (true) 
              //创建一个数据包,用于接收数据
              byte[] bys = new byte[1024];
              DatagramPacket dp = new DatagramPacket(bys, bys.length);
      
              ds.receive(dp);
                  System.out.println("接收到的数据是:" + new String(dp.getData(),0,dp.getLength()));
              
      
          
      
      
  • sendme

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;
    
    public class sendme 
        public static void main(String[] args) throws IOException 
            
            DatagramSocket ds = new DatagramSocket();
            Scanner sc = new Scanner(System.in);
            while (true) 
                String s = sc.nextLine();
                //输入的数据是886,发送数据结束
                if ("886".equals(s)) 
                    break;
                
                byte[] bys = s.getBytes();
                DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("Dinesaw"), 10086);
                ds.send(dp);
            
            ds.close();
        
    
    
    

基于UDP协议的网络通信应用程序(UDP-Socket)

可点击右上角的 …,分享这篇文章


前两篇文章介绍了基于TCP/IP协议的网络通信应用程序。相比起TCP/IP协议的可靠,面向连接,基于字节流通信这些特性,UDP协议是一种轻量级,不可靠,基于数据报的传输协议。


很多人会问,为什么UDP协议传输不可靠还要继续使用它?那是因为UDP协议使用起来很方便,不需要建立连接,资源消耗少,通信效率高,在线播放音频或者视频的时候,使用UDP协议比使用TCP/IP协议有更高的传输效率,因为在这种使用场景下,即使丢失一两个数据包,对结果都影响不大。在网络质量不佳的情况下,使用UDP协议传输可能丢包严重,开发者应该注意根据不同的场合选择合适的协议。


对于UDP传输协议,数据报有以下三种传输方式:



使用嵌入式QT进行UDP协议的网络通信应用程序开发,QT的network类库提供了QUdpSocket类,这个类继承于QAbstractSocket类,并向应用层提供了UDP通信的基本操作方法,如绑定函数bind(),加入组播joinMulticastGroup(),离开组播leaveMulticastGroup(),数据报的读写操作函数,等等。具体可以参阅 QtNetwork/qudpsocket.h 文件的内容。


目标:

使用QT提供的UDP网络通信类,实现一个简单的Udp_Socket收发工具。

功能:

(3)可选择UDP数据报的发送方式:组播,单播,广播。

(4)界面显示UDP协议的网络收发数据,并提供清屏按钮。

(5)提供手动发送按钮和自动发送按钮。


开发板运行Udp_Socket收发工具后,界面如下图所示:

界面描述:

(3)选择UDP的发送方式,单播,组播或广播。

(5)点击 [START_AUTO_SEND] ,以一秒的频率间隔发送数据。


以下是应用程序的开发过程。


1、 先用Qt Creator构建一个工程,命名为:009_udp_socket,关于如何构建工程,请参考“第一个嵌入式QT应用程序”的具体内容。


2、 创建工程后,修改009_udp_socket.pro里面的内容,添加QT里面的网络通信模块network,使工程支持QT网络类的调用,如下图所示。

(9)基于UDP协议的网络通信应用程序(UDP-Socket)


3、 双击打开“widget.ui”文件,构建界面,构建后的界面如下图所示:

(9)基于UDP协议的网络通信应用程序(UDP-Socket)

应用程序界面描述如上面内容所示,这里不作重复。


(9)基于UDP协议的网络通信应用程序(UDP-Socket)

(9)基于UDP协议的网络通信应用程序(UDP-Socket)


6、 当应用程序接收到UDP的数据报时,底层系统就会触发readRead()信号,进而调用数据接收的槽函数void UdpSocket::slot_udp_read_data()进行处理。数据接收槽函数如下图所示:

(9)基于UDP协议的网络通信应用程序(UDP-Socket)

这个函数不断读取缓冲区的数据,读取完成后,发送信号通知ui界面进行数据显示。


(9)基于UDP协议的网络通信应用程序(UDP-Socket)


8、 以上就是UdpSocket类的主要函数实现,接下来,分析一下窗体构造Widget类的具体实现过程。


(9)基于UDP协议的网络通信应用程序(UDP-Socket)


10、 应用程序可以自由选择(单播,组播,广播)这三种发送方式的其中一种,可以通过使用radioButton来实现互斥,当发送方式发生改变时,调用以下槽函数进行处理。

(9)基于UDP协议的网络通信应用程序(UDP-Socket)


(9)基于UDP协议的网络通信应用程序(UDP-Socket)


12、 以上就是整个Udp_Socket应用程序的开发过程,相比起TCP/IP,使用UDP协议进行数据传输是比较方便快捷的,开发者应该根据不同的应用场景选择不同的数据传输协议,每种协议都各有利弊,合适的就是最好的。


13、 把应用程序下载到开发板上运行,如下图所示:



-- END --






以上是关于网络编程-UDP通信程序的主要内容,如果未能解决你的问题,请参考以下文章

[Java网络编程]UDP通信程序练习

UDP网络通信程序

JAVA网络编程--UDP通信

网络编程

QT的UDP通信编程问题

06网络通信udp-tcp正则