Java基于UDP的Socket通信

基于UDP协议的Socket通信通过收发数据报的方式进行数据传递。在Java中,实现走UDP协议的Socket通信需要用到的两个类:DatagramSocketDatagramPacket

DatagramPacket

看类名就可以知道,这个类是数据报包
这个类可以将要发送或者接收的二进制数据封装起来,同时也包含了数据的长度、发送的地址和地址端口等信息。

常用的一些方法:

构造方法
DatagramPacket(byte[] buf, int length)
Constructs a DatagramPacket for receiving packets of length length.
为接收数据报创建一个数据报包

构造方法
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
Constructs a datagram packet for sending packets of length length to the specified port number on the specified host.
为给特定地址端口发送数据报创建一个数据报包

注:

参数byte[] buf和int length为数据的字节数组和数据的二进制长度;

前一个构造方法一般为接收使用,接收到的数据会保存在参数传入的字节数组中,length参数则指定了接收数据的最大的长度;

后一个构造方法一般为发送使用,同样,参数传入的字节数组为将要发送的数据,length参数是字节数组的长度,而跟在后面的两个参数InetAddress对象和一个整型则分别为接收方的地址和端口号。

InetAddress getAddress()
Returns the IP address of the machine to which this datagram is being sent or from which the datagram was received.
返回数据报发送方或接收方的地址(InetAddress对象)

byte[] getData()
Returns the data buffer.
返回数据缓冲的引用

int getLength()
Returns the length of the data to be sent or the length of the data received.
返回将要发送或接收到的数据的长度

int getPort()
Returns the port number on the remote host to which this datagram is being sent or from which the datagram was received.
返回远程服务器的端口号

DatagramSocket

这个类就是用来发送和接收数据报的

常用的一些方法:

构造方法
DatagramSocket()
Constructs a datagram socket and binds it to any available port on the local host machine.
创建一个数据报socket并绑定任何可用的本地端口

构造方法
DatagramSocket(int port)
Constructs a datagram socket and binds it to the specified port on the local host machine.
创建一个数据报socket并绑定特定的本地端口

void receive(DatagramPacket p)
Receives a datagram packet from this socket.
接收一个从Socket发来的数据报包

void send(DatagramPacket p)
Sends a datagram packet from this socket.
发送一个数据报包

注:

receive(DatagramPacket)和send(DatagramPacket)两个方法传入的参数有所区别:
receive传入的DatagramPacket指定的字节数组是缓冲区,指定的长度则指明了缓冲区的大小,这个缓冲的大小可以根据大小调节;接收到数据报后调用getLength()返回的是数据报的长度;
send传入的DatagramPacket指定的字节数组则是待发送的数据,指定的长度则应为字节数组的长度;

当调用了receive(DatagramPacket)方法而未接收到数据报时,线程处于阻塞状态;若在之前用过setSoTimeout(int)设定等待时间,而在等待时间过后未接收到数据报,则线程状态恢复。

以上引用的内容来自Java API 1.8.0
更多相关的类和方法可参阅 Java API


接收数据报实例
  1. 创建DatagramSocket实例并指定接收端口号
  2. 创建接收数据报的DatagramPacket实例
  3. 等待并接收数据报
  4. 处理数据报的数据据
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {

    public void start() throws IOException {//将异常抛出

        //创建DatagramSocket实例,指定8000端口
        DatagramSocket socket = new DatagramSocket(8000);

        //创建接收数据报包
        byte[] data = new byte[10240];
        DatagramPacket packet = new DatagramPacket(data, data.length);

        //等待和接受数据报包
        socket.receive(packet);

        //处理数据报
        String msg = new String(data, 0, packet.getLength());
        System.out.println(msg);

        socket.close();

    }

    public static void main(String[] args) {
        try {
            new UDPServer().start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
发送数据报实例
  1. 指定数据报传递的数据、接收方的地址和端口号
  2. 创建DatagramPacket实例
  3. 发送数据包
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {

    public void start() throws IOException{

        //数据报的内容、接收的地址和端口(本地8000端口)
        String msg = "一段文字来自Client";
        byte[] data = msg.toString().getBytes();
        InetAddress address = InetAddress.getByName("localhost");
        int port = 8000;

        //创建数据报包
        DatagramPacket packet = new DatagramPacket(data, data.length, address, port);

        //创建DatagramSocket实例发送数据报
        DatagramSocket socket = new DatagramSocket();
        socket.send(packet);

        socket.close();

    }

    public static void main(String[] args) {
        try {
            new UDPClient().start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

另外
基于TCP/IP和UDP的Socket通信都可以结合Java的多线程等其他机制和编程技巧,实现其他更完善更强大的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值