网络编程——(3)UDP协议

目录

一、 首先需要明确什么是Socket?

二、UDP

2.1DatagramSocket

2.1.1构造方法

2.1.2 常用方法

3.1DatagramPacket 

3.1.1构造方法

3.1.2常用方法


一、 首先需要明确什么是Socket?

 

        

在java.net包中有一个socket包 java.net.socket包。

实际上Socket就可以理解为船舶运输的端点、起始点码头,IO数据就是船舶上的货物。

二、UDP

UDP协议是一种公共的协议,我们无法直接操作,Java为我们提供了一些对象封装了UDP,所以可以间接操作UDP。

在API中我们找到了 java.net.DatagramSocket

2.1DatagramSocket

2.1.1构造方法

 

 

 

 
ModifierConstructor and Description
 DatagramSocket()

构造数据报套接字并将其绑定到本地主机上的任何可用端口。

protected DatagramSocket(DatagramSocketImpl impl)

使用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。

 DatagramSocket(int port)

构造数据报套接字并将其绑定到本地主机上的指定端口。

 DatagramSocket(int port, InetAddress laddr)

创建一个数据报套接字,绑定到指定的本地地址。

 DatagramSocket(SocketAddress bindaddr)

创建一个数据报套接字,绑定到指定的本地套接字地址。

2.1.2 常用方法

 

voidbind(SocketAddress addr)

将此DatagramSocket绑定到特定的地址和端口。

voidclose()

关闭此数据报套接字。

voidconnect(InetAddress address, int port)

将套接字连接到此套接字的远程地址。

booleanisClosed()

返回套接字是否关闭。

InetAddressgetInetAddress()

返回此套接字连接到的地址。

InetAddressgetLocalAddress()

获取套接字所绑定的本地地址。

voidsend(DatagramPacket p)

从此套接字发送数据报包。

在看到send 发送方法看到了DatagramPacket 

3.1DatagramPacket 

查看API介绍发现是用于装数据的。

3.1.1构造方法

 

Constructor and Description
DatagramPacket(byte[] buf, int length)

构造一个 DatagramPacket用于接收长度的数据包 length

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

DatagramPacket(byte[] buf, int offset, int length)

构造一个 DatagramPacket用于接收长度的分组 length ,指定偏移到缓冲器中。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)

构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号。

DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)

构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号。

DatagramPacket(byte[] buf, int length, SocketAddress address)

构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

在众多的构造方法中有发送功能的,有接收功能的,区别发送功能和接收功能的就是看参数中有无address、port。有就是指明将要发送的目的地。

3.1.2常用方法

 

Modifier and TypeMethod and Description
InetAddressgetAddress()

返回该数据报发送或接收数据报的计算机的IP地址。

byte[]getData()

返回数据缓冲区。

intgetLength()

返回要发送的数据的长度或接收到的数据的长度。

intgetOffset()

返回要发送的数据的偏移量或接收到的数据的偏移量。

intgetPort()

返回发送数据报的远程主机上的端口号,或从中接收数据报的端口号。

SocketAddressgetSocketAddress()

获取该数据包发送到或正在从其发送的远程主机的SocketAddress(通常为IP地址+端口号)。

voidsetAddress(InetAddress iaddr)

设置该数据报发送到的机器的IP地址。

voidsetData(byte[] buf)

设置此数据包的数据缓冲区。

voidsetData(byte[] buf, int offset, int length)

设置此数据包的数据缓冲区。

voidsetLength(int length)

设置此数据包的长度。

voidsetPort(int iport)

设置发送此数据报的远程主机上的端口号。

voidsetSocketAddress(SocketAddress address)

设置该数据报发送到的远程主机的SocketAddress(通常是IP地址+端口号)。

三、UPD传输实例

3.1 创建发送端:

public class UDPSendDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("发送端启动...........");
        /**
         * 创建UDP传输的发送端
         * 思路:
         * 1、建立UDP的Socket服务
         * 2、将要发送的的数据封装到数据包中
         * 3、通过UDP的Socket服务将数据包发送出去
         * 4、关闭Socket服务
         */
        //1 updsocket服务 使用 datagramSocket
        DatagramSocket  ds =new DatagramSocket(9999);
        //2,将要发送的数据封装到数据包中。
        String str="hello 小年快乐";

        //使用DatagramPacket将数据封装到的该对象包中。
        byte[] bytes=str.getBytes();
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length, InetAddress.getByName("127.0.0.1"),8888);
        //3,通过udp的socket服务将数据包发送出去。使用send方法。
        ds.send(dp);
        //4、关闭Socket服务
        ds.close();
    }
    
}

3.2 创建接收端

public class UDPReceDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("接收端启动............");

        /**
         * 建立UDP接收端的服务
         *1、建立udp的socket服务,必须明确一个和发送端一直的端口
         *2、创建数据包,方便存储接收到的数据。方便使用数据包对象的方法解析这些数据。
         *3、使用socket服务的receive方法将接收到的数据存储到数据包中。
         *4、通过数据包的方法解析数据。
         *5、关闭socket资源。
         */
        //1、建立udp的socket服务,必须明确一个和发送端一致的端口
        DatagramSocket ds=new DatagramSocket(8888);
        //2、创建数据包,方便存储接收到的数据。方便使用数据包对象的方法解析这些数据。
        byte[] buf =new byte[1024];
        DatagramPacket  dp=new DatagramPacket(buf,0,buf.length);

        //3、使用socket服务的receive方法将接收到的数据存储到数据包中。
        //此方法为阻塞式方法
        ds.receive(dp);

        //4、通过数据包对象的方法。 解析其中的数据:地址、端口、内容
        String hostAddress = dp.getAddress().getHostAddress();
        int port = dp.getPort();
        String text=new String(dp.getData(),0,dp.getLength());
        System.out.println(hostAddress+":"+port+":"+text);
        ds.close();
    }
}

先启动接收端。

再启动发送端:

重看接收端:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真香号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值