zoukankan      html  css  js  c++  java
  • 《java入门第一季》之UDP协议下的网络编程详解

    首先看一下UDP协议的图解:



    可以看到,分为发送端和接收端程序。

    直接上代码:

    发送端程序:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    /*
     * UDP协议发送数据:                            						(底层是IO)
     * A:创建发送端Socket对象
     * B:创建数据,并把数据打包
     * C:调用Socket对象的发送方法发送数据包
     * D:释放资源
     */
    public class SendDemo {
    	public static void main(String[] args) throws IOException {
    		// 创建发送端Socket对象
    		// 发送端DatagramSocket类的无参构造方法:public DatagramSocket():构造数据套接字并将其绑定到本地主机上任何可用的端口。
    		DatagramSocket ds = new DatagramSocket();
    
    		// 创建数据,并把数据打包
    		/*
    		 * public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
    		 * 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
    		 * buf - 包数据。length - 包长度。address - 目的地址。port - 目的端口号。(与下面的对应)
    		 */
    		// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    		// 创建数据
    		byte[] bys = "hello,UDP,我来了".getBytes();
    		// 长度
    		int length = bys.length;
    		// IP地址对象
    		InetAddress address = InetAddress.getByName("192.168.1.100");//这是我的电脑的另一台电脑的ip地址
    		// 端口
    		int port = 10086;
    		DatagramPacket dp = new DatagramPacket(bys, length, address, port);
    
    		// 调用Socket对象的发送方法发送数据包
    		// public void send(DatagramPacket p)
    		/*
    		 * public void send(DatagramPacket p)从此套接字发送数据报包。
    		 * DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。找DatagramPacket构造方法,能传递数据、其长度、远程主机的 IP 地址和远程主机的端口号
    		 */
    		ds.send(dp);
    
    		// 释放资源       	DatagramSocket类下:public void close()关闭此数据报套接字。
    		ds.close();
    	}
    }
    

    接着写出接收端:在我的另一台电脑写出来的。

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /*
     * UDP协议接收数据:
     * A:创建接收端Socket对象
     * B:创建一个数据包(接收容器),我称它为集装箱
     * C:调用Socket对象的接收方法接收数据
     * D:解析数据包,并显示在控制台
     * E:释放资源
     */
    public class ReceiveDemo {
    	public static void main(String[] args) throws IOException {
    		// 创建接收端Socket对象
    		// DatagramSocket(int port)
    		DatagramSocket ds = new DatagramSocket(10086);
    
    		// 创建一个数据包(接收容器)
    		// DatagramPacket(byte[] buf, int length)构造 DatagramPacket,用来接收长度为 length 的数据包。
    		byte[] bys = new byte[1024];
    		int length = bys.length;
    		DatagramPacket dp = new DatagramPacket(bys, length);
    
    		// 调用Socket对象的接收方法接收数据
    		// DatagramSocket类:public void receive(DatagramPacket p)从此套接字接收数据报包。p - 要放置传入数据的 DatagramPacket。 
    
    		ds.receive(dp); // 阻塞式   此时接收数据后存储到dp(收端的集装箱)里面了
    
    		// 解析数据包,并显示在控制台
    		// 获取对方的ip对象。某台机器的 IP 地址,此数据报将要(发往)该机器或者是从该机器(接收)到的。这里是接收方IP名称对象
    		// public InetAddress getAddress()
    		InetAddress address = dp.getAddress();//getAddress().你发送端是发往哪个IP地址,这里就是那个IP地址的对象
    		String ip = address.getHostAddress();//获取发送端的IP地址
    		// public byte[] getData():获取数据缓冲区
    		// public int getLength():获取数据的实际长度
    		byte[] bys2 = dp.getData();//实际从发送方接收了的数据存储的字节长度,单独开一个数组存储。实际上是存在了bys里面;但是实际长度不知道多长,这里是吧实际长度从bys里拿出来组成了一个数组
    		int len = dp.getLength();//实际从发送方接收了数据字节有多大public int getLength()返回将要发送或接收到的数据的长度。 这里是实际接收到的长度
    		String s = new String(bys2, 0, len);//通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于该byte数组的长度。 
    		System.out.println(ip + "传递的数据是:" + s);
    		//String构造方法:——public String(byte[] bytes,int offset,int length)。把bytes数组,从offset开始length的字节转换为字符串。
    		// 释放资源
    		ds.close();
    	}
    }
    

    udp实现了网络传输数据。把数据从一台电脑发送到了另一台电脑

  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299735.html
Copyright © 2011-2022 走看看