黑马程序员-Java的UDP类

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-


  • DatagramPacket
  • DatagramSocket

DatagramSocket 类是用来接受和发送数据包的套接字。使用UDP协议来通信的话要使用IO包中的这两个类。

JDK中的描述

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

利用UDP协议进行通信的步骤:

客户端发送数据时要指定发送到哪台主机的哪个端口,接收端要指定监听哪个端口,以接收这个传到这个端口的数据。所以步骤一样,但具体实现是有差别的。

  1. 定义套接字
  2. 定义好要传输的数据
  3. 定义好数据包
  4. 发送数据包
  5. 关闭套接字

客户端
可以绑定本地任意端口或绑定到一个指定的端口,用此端口进行通信。

  1. 创建套接字

    • 绑定本地任意端口
      DatagramSocket ds new DatagramSocket();
    • 绑定到指定的本机端口上
      DatagramSocket ds new DatagramSocket(int port);
  2. 创建要传输的数据
    传送的是字节信息,所以使用byte类型存放要传输的数据。

      byte[] buf = new byte[1024];
    
  3. 把数据封装进数据包

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

用长度为length的buf数组封装成数据包,发送到address主机的port口上

    DatagramPacket dp = new  DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10002);
  1. 发送数据包

    void send(DatagramPacket p);
    

    使用DatagramSocket的send方法发送数据包。

    ds.send(dp);
    

5.关闭套接字

ds.close();

服务端
1. 创建套接字,并监听本地10002端口

DatagramSocket ds = new DatagramSocket(10002);

2. 创建用来存放接收到的数据的字节数组

byte buf[] = new byte[1024];

3. 创建数据报包,

DatagramPacket dp = new DatagramPacket(buf,buf.length);

4. 接受数据,使用DatagramScoket类对象的receive方法接受数据报包,接收到数据报包前一直阻塞。

ds.receive(dp);

5. 提取接收到的数据报包中的内容

byte[] getData() 获取数据报包中的数据

int getLength() 数据报包中数据的长度

InetAddress getAddress() 获取数据包中的IP地址
构造一个字符串,内容为数据包的数据。

String data = new (dp.getData(),0,dp.getLength());

获取发送数据报包的主机地址
String ip = new (dp.getAddress().getHostAddress());
代码小例子:

import java.net.*;
import java.io.*;


class Udp
{
    public static void main(String[] args)throws IOException
     {

        byte[] buf = "Hello Java".getBytes();

        DatagramSocket ds = new DatagramSocket();

        DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10002);    

        ds.send(dp);

        ds.close();

    }
}

class UdpR
{
    public static void main(String[] args)throws IOException
     {

        DatagramSocket ds = new DatagramSocket(10002);

        byte buf[] = new byte[1024];

        DatagramPacket dp = new DatagramPacket(buf,buf.length);
        ds.receive(dp);

        String ip = dp.getAddress().getHostAddress();

        String data = new String(dp.getData(),0,dp.getLength());

        System.out.println(ip+"..."data);

        ds.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值