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实现了网络传输数据。把数据从一台电脑发送到了另一台电脑

  • 相关阅读:
    System 类的使用
    StringBuffer 与 StringBuilder类的使用
    String 类 的 使用
    多线程
    音乐播放
    数据库
    表示图编辑
    UITextView(2)
    UITextView
    tarBar
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299735.html
Copyright © 2011-2022 走看看