网络编程——(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构造方法

 
Modifier Constructor and Description
  DatagramSocket()

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

protected DatagramSocket(DatagramSocketImpl impl)

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

  DatagramSocket(int port)

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

  DatagramSocket(int port, InetAddress laddr)

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

  DatagramSocket(SocketAddress bindaddr)

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

2.1.2 常用方法

void bind(SocketAddress addr)

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

void close()

关闭此数据报套接字。

void connect(InetAddress address, int port)

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

boolean isClosed()

返回套接字是否关闭。

InetAddress getInetAddress()

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

InetAddress getLocalAddress()

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

void send(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 Type Method and Description
InetAddress getAddress()

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

byte[] getData()

返回数据缓冲区。

int getLength()

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

int getOffset()

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

int getPort()

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

SocketAddress getSocketAddress()

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

void setAddress(InetAddress iaddr)

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

void setData(byte[] buf)

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

void setData(byte[] buf, int offset, int length)

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

void setLength(int length)

设置此数据包的长度。

void setPort(int iport)

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

void setSocketAddress(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();
    }
}

先启动接收端。

再启动发送端:

重看接收端:

发布了186 篇原创文章 · 获赞 45 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zhanshixiang/article/details/104039372