• UDP通信程序


    UDP通信原理
    UDP协议是一种不可靠的网络协议, 它在通信的两端各建立-个Socke树象,但是这两个Socket只是发送,接收数据的对象
    因此对于基于UDP协议的通信方而言,没有所谓的客户端和服务器的概念
    Java提供了 DatagramSocket 类作为基于UDP协议的Socket

     UDP发送数据
    发送数据的步骤
    ①创建发送端的Socket对象(DatagramSocket)  //使用无参构造方法
    ②创建数据, 并把数据打包 //有参构造

    DatagramPacket​(byte[] buf, int length, InetAddress address, int port) // 构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
    ③调用DatagramSocke对象的方法发送数据 send
    ④关闭发送端  close

    package com.ThreadTest;
    /*
    UDP发送数据的步骤
        1:创建发送端的Socket对象(DatagramSocket)
        2:创建数据,并把数据打包
        3:调用DatagramSocket对象的方法发送数据
        4:关闭发送端
    
     */
    
    import java.io.IOException;
    import java.net.*;
    
    public class SendDemo {
        public static void main(String[] args) throws IOException {
    //        1:创建发送端的Socket对象(DatagramSocket)
    //      构造方法  DatagramSocket​()
    // 构造数据报套接字并将其绑定到本地主机上的任何可用端口。
            DatagramSocket ds = new DatagramSocket();
    
    //        2:创建数据,并把数据打包
    //        public final class DatagramPacket extends Object该类表示数据报包。
    //此类的构造方法:
    //        DatagramPacket​(byte[] buf, int length, InetAddress address, int port)
    //        构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
    //        byte[] bys = "hello,udp我来了".getBytes();
    //        InetAddress address = InetAddress.getByName("192.168.18.6");
    //        int port = 10086;
    //        DatagramPacket dp = new DatagramPacket(bys, bys.length, address, 10086);
            byte[] bys = "hello,udp我来了".getBytes();
            DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.18.6"), 10086);
    
    
    //        3:调用DatagramSocket对象的方法发送数据
    //        void receive​(DatagramPacket p) 从此套接字接收数据报包。
    //        void send​(DatagramPacket p) 从此套接字发送数据报包。
    
            ds.send(dp);
    //        4:关闭发送端
    //        void close​() 关闭此数据报套接字。
            ds.close();
        }
    }

    UDP接收数据
    接收数据的步骤
    ①创建接收端的Socket对象(DatagramSocket) //

    DatagramSocket​(int port)
    构造数据报套接字并将其绑定到本地主机上的指定端口。
     
    DatagramSocket​(int port, InetAddress laddr)
    创建一个数据报套接字,绑定到指定的本地地址。


    ②创建一 个数据包,用于接收数据
    ③调用DatagramSocket对象的方法接收数据
    ④解析数据包,并把数据在控制台显示
    ⑤关闭接收端

    package com.ThreadTest;
    /*
            UDP接收数据的步骤
                1:创建接收端的Socket对象(DatagramSocket)
                2:创建一个数据包,用于接收数据
                3:调用DatagramSocket对象的方法接收数据
                4:解析数据包,并把数据在控制台显示
                5:关闭接收端
    
     */
    
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class ReceiveDemo {
        public static void main(String[] args) throws IOException {
    //        1:创建接收端的Socket对象(DatagramSocket)
    //        使用有参构造 DatagramSocket​(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。
            DatagramSocket ds = new DatagramSocket(10086);
    
    //        2:创建一个数据包,用于接收数据
    //     DatagramPacket​(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度为 length数据包。
    //        public int getLength​()返回要发送的数据的长度或接收到的数据的长度。
            byte[] by2 = new byte[1024];
    
            DatagramPacket dp = new DatagramPacket(by2, by2.length);
    
    
    
    
    //        3:调用DatagramSocket对象的方法接收数据
    //        void receive​(DatagramPacket p) 从此套接字接收数据报包。
            ds.receive(dp);
    
    //        4:解析数据包,并把数据在控制台显示
    //        DatagramPacket类下的方法
    //        public byte[] getData​()返回数据缓冲区。
    //        收到的数据或要发送的数据从缓冲区中的offset开始运行, length为length 。
            int len = dp.getLength();
            byte[] data = dp.getData();
            String string = new String(data,0,len);
            System.out.println(string);
    
    
    //        5. 关闭接收端
            ds.close();
    
        }
    }

    下面是练习:

    发送端

    package com.ThreadTest;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /*
    UDP发送数据:
    数据来自于键盘录入,直到输入的数据是886,发送数据结束
    
     */
    
    public class SendDemo01 {
        public static void main(String[] args) throws IOException {
            //创建发送端的Socket对象(DatagramSocket)
            DatagramSocket ds = new DatagramSocket();
    
            //自己封装键盘录入
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String line;
            while ((line = br.readLine()) != null) {
                //数据是886,发送数据结束
                if ("886".equals(line)) {
                    break;
    
                }
                //创建数据并把数据打包
                byte[] bys = line.getBytes();
    //            getByName​(String host) 确定主机名称的IP地址。
                DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.18.6"), 10010);
                //调用DatagramSocket的方法发送数据
                ds.send(dp);
            }
            //关闭发送端
            ds.close();
    
    
        }
    }

    接收端

    package com.ThreadTest;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    /*
    UDP接收数据:
    因为接收端不知道发送端什么时候停止发送,故采用死循环接收
    
     */
    
    public class ReceiveDemo01 {
        public static void main(String[] args) throws IOException {
            //创建接收端Socket对象
    //        使用有参构造 DatagramSocket​(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。
            DatagramSocket ds = new DatagramSocket(10010);
            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()));
            }
    
            //创建数据包,用于接收数据
    //        DatagramPacket​(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度为 length数据包。
    ////        public int getLength​()返回要发送的数据的长度或接收到的数据的长度。
    
    
            //关闭接收端
    //        ds.close();
    
    
        }
    }

     

  • 相关阅读:
    VIM文本替换命令
    VIM格式化代码(How to format code with VIM)
    字符串匹配的Boyer-Moore算法
    Java中数组的遍历
    UVa10723
    uva242,Stamps and Envelope Size
    UVa1630,Folding
    uva1629,Cake Slicing,记忆化搜索
    uva 10118,记忆化搜索
    uva10003
  • 原文地址:https://www.cnblogs.com/lsswudi/p/11439049.html
Copyright © 2020-2023  润新知