java单播多播socket_Java单播、组播(多播)、广播的简单实现

简介

单播有TCP和UDP两种实现,组播(多播)和广播只有UDP一种实现。单播和广播基本同样,只是广播的数据包IP为广播IP。

单播

DatagramSocket和DatagramPacket

服务端:

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class UDPServer {

public static void main(String[] args) throws Exception {

System.out.println("启动UDP单播服务端");

// 构造DatagramSocket实例,指定本地端口6666

try (DatagramSocket datagramSocket = new DatagramSocket(6666)) {

//设置超时时间为10秒

datagramSocket.setSoTimeout(10000);

while (true) {

// 应用层交给UDP多长的报文,UDP就照样发送,一次发送一个报文。报文最大长度有限制,不然会致使IP层分片,最大值最好小于548字节

// 构造DatagramPacket实例,用来接收最大长度为512字节的数据包

byte[] data = new byte[512];

DatagramPacket receivePacket = new DatagramPacket(data, 512);

// 接收报文,此方法在接收到数据报前一直阻塞

datagramSocket.receive(receivePacket);

System.out.println("客户端地址:" + receivePacket.getAddress().getHostAddress());

System.out.println("客户端端口:" + receivePacket.getPort());

System.out.println("接收到的数据长度:" + receivePacket.getLength());

System.out.println("接收到的数据:" + new String(receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8"));

}

}

}

}

客户端:

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetSocketAddress;

public class UDPClient {

public static void main(String[] args) throws Exception {

{

// 构造DatagramSocket实例,指定本地端口8888

try (DatagramSocket datagramSocket = new DatagramSocket(8888)) {

for (int i = 0; i < 5; i++) {

String data = "当前循环:" + i;

// 构造数据报包,用来将data发送到指定主机上的指定端口号。

DatagramPacket sendPacket = new DatagramPacket(data.getBytes("UTF-8"), data.getBytes("UTF-8").length, new InetSocketAddress("10.206.16.67", 6666));

//发送报文

datagramSocket.send(sendPacket);

}

}

}

}

}

服务端打印:

启动UDP单播服务端

客户端地址:10.206.16.67

客户端端口:8888

接收到的数据长度:16

接收到的数据:当前循环:0

客户端地址:10.206.16.67

客户端端口:8888

接收到的数据长度:16

接收到的数据:当前循环:1

客户端地址:10.206.16.67

客户端端口:8888

接收到的数据长度:16

接收到的数据:当前循环:2

客户端地址:10.206.16.67

客户端端口:8888

接收到的数据长度:16

接收到的数据:当前循环:3

客户端地址:10.206.16.67

客户端端口:8888

接收到的数据长度:16

接收到的数据:当前循环:4

Exception in thread "main" java.net.SocketTimeoutException: Receive timed out

at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)

at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:120)

at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:144)

at java.net.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值