JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法
来源:互联网 发布:unity3d 鼠标控制旋转 编辑:程序博客网 时间:2024/04/30 12:09
UDP既可以单播也可以组播
一,单播
单播的过程为
发送方:
InetAddress destAddr = InetAddress.getByName("192.168.4.199");// 发送的目的地址
int targetPort = 3001; // 发送的目的端口
DatagramSocket socket = new DatagramSocket();
byte[] b = “信息”.getBytes();
DatagramPacket pk = new DatagramPacket(b, b.length, destAddr, targetPort);
socket.send(pk);//发送
接收方:
int port = 3001;//接收数据包的IP端口
DatagramSocket socket = new DatagramSocket(port);
byte b[] = new byte[512];
DatagramPacket pack = new DatagramPacket(b, b.length);
socket.receive(pack);//接收信息
int length = pack.getLength();
String msg = new String(pack.getData(),0,length);
Logger.getGlobal().info(msg);
代码示例:
/** * 001 UDP单播发送,启动后在控制台输出 */public class SSend {public static void main(String[] args) throws SocketException, IOException {InetAddress destAddr = InetAddress.getByName("192.168.4.199");// 发送的目的地址int targetPort = 3001; // 发送的目的端口try (DatagramSocket socket = new DatagramSocket(); Scanner r = new Scanner(System.in);) {while (true) {String s = r.nextLine();byte[] b = s.getBytes();DatagramPacket pk = new DatagramPacket(b, b.length, destAddr, targetPort);socket.send(pk);//发送}} catch (Exception e) {e.printStackTrace();}}}
/** * 001 * UDP单播接收服务 */public class SReceive {public static void main(String[] args) throws UnknownHostException {int port = 3001;//接收数据包的IP端口try(DatagramSocket socket = new DatagramSocket(port);) {byte b[] = new byte[512];DatagramPacket pack = new DatagramPacket(b, b.length);while(socket!=null){socket.receive(pack);//接收信息int length = pack.getLength();String msg = new String(pack.getData(),0,length);Logger.getGlobal().info(msg);}} catch (Exception e) {e.printStackTrace();}}}
二,组播
组播使用D类地址,D类地址不会被写入IP报文的源地址IP
我们使用D类地址中的用户组播地(224.0.2.0~238.255.255.255)址来测试
发送方:
MulticastSocket socket = new MulticastSocket(2011);
InetAddress mcastaddr = InetAddress.getByName("224.116.8.0");
socket.joinGroup(mcastaddr);//加入 组播组
byte[] b = msg.getBytes();
DatagramPacket pack = new DatagramPacket(b, b.length, mcastaddr, port);
socket.send(pack);//组播发送 数据报,可被group成员接收到
接收方和发送方开始的代码类似,都是指定IP和端口,加入组播组:
InetAddress mcastaddr = InetAddress.getByName("224.116.8.0");
MulticastSocket socket = new MulticastSocket(port);
socket.joinGroup(mcastaddr);
byte b[] = new byte[512];
DatagramPacket pack = new DatagramPacket(b, b.length, mcastaddr, port);
socket.receive(pack);
String msg = new String(pack.getData(), 0, b.length);
Logger.getGlobal().info(msg);
示例代码:
/** * 002组播 输出接收到的字符串 */public class MReceive {public static void main(String[] args) {String host = "224.116.8.0";int port = 2011;try (MulticastSocket socket = new MulticastSocket(port);) {InetAddress mcastaddr = InetAddress.getByName(host);socket.joinGroup(mcastaddr);byte b[] = new byte[512];DatagramPacket pack = new DatagramPacket(b, b.length, mcastaddr, port);while (true) {socket.receive(pack);String msg = new String(pack.getData(), 0, b.length);Logger.getGlobal().info(msg);}} catch (Exception e) {e.printStackTrace();}}}<pre name="code" class="java">/** * 002 组播 */public class MSend {private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss:SSS");// 显示日期格式public static void main(String[] args) {String host = "224.116.8.0";int port = 2011;Timer t = new Timer();t.schedule(new TimerTask() {@Overridepublic void run() {send(host, port, SDF.format(new Date()));}}, 0, 2000);}public static void send(String addr, int port, String msg) {try (MulticastSocket socket = new MulticastSocket(port);) {// TTL从字面上翻译,是可以存活的时间,但实际上TTL是IP数据包在计算机网络中可以转发的最大跳数,1为本地网络socket.setTimeToLive(1);InetAddress mcastaddr = InetAddress.getByName(addr);socket.joinGroup(mcastaddr);// 加入 组播组byte[] b = msg.getBytes();DatagramPacket pack = new DatagramPacket(b, b.length, mcastaddr, port);// 待发送数据包socket.send(pack);// 组播发送 数据报,可被group成员接收到} catch (Exception e) {e.printStackTrace();}}}
三,组播各个机器不互通的解决方法
由于单播是指定发送目的的IP和端口,所有只要能ping通对方的IP就能将单播的UDP报文发送过去。
但是对于组播,由于加入和发送的目的是D类地址,所以得保证各个机器之间是同一个网段
①禁止其他网卡,只保留一块网卡(我是将笔记本的无线网卡金庸,只用我的有线网卡),以及公司的台式机
②修改IP和网关,确认在同一网段
下面是我的电脑我另一台测试电脑的网络设置
- JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法
- JAVA 网络编程(4) SOCKET UDP 单播聊天示例
- “单播”“组播”和“多播”
- 单播,组播(多播),广播以及任播
- Java UDP 单播、多播(组播)、广播、任播(未实现)
- 单播、多播(组播)和广播的
- UDP 单播 组播 广播
- 单播、广播、组播 - udp
- 多播(组播)、单播、任播和广播
- UDP单播和组播使用SO_REUSEADDR 测试结果
- 【Java TCP/IP Socket】 — 单播、广播、组播
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- 网络基本概念之TCP, UDP, 单播(Unicast), 多播(组播)(Multicast)
- Linux网络编程 之 UDP 组播
- Linux网络编程-UDP组播
- 6.0视频电话流程
- UVA11324 The Largest Clique (强联通+缩点+DAG上DP最长路)
- 在ES6类中绑定事件
- AFNetworking联网状态监测初探索
- git常用命令大全
- JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法
- C语言入门-第四周:作业01
- 完成微信开发需要什么技术
- 移植u-boot12.04到jz2440 -->支持nandflash启动
- js对表单数据的抓取与通过ajax方式提交(新手笔记)
- IOS 字符串中去除特殊符号 stringByTrimmingCharactersInSe
- ImageButton边框问题
- centos 7下创建Flask开发环境
- 辩论之术