Java网络编程之组播小案例

原创 2012年03月26日 16:52:53

网络数据传输分为三类,单播,广播,组播,其中组播是兼容前两者特点。发送者每次发送的数据可以被组内的所有

接受者收到。在组内的发送者和每一个接受者之间实现点到多点网络传输,也称多点传送。

组播是一种介于单播传输和广播传输之间的一种中间技术。当采用组播方式传送数据包时,发送方只需要发送一份

相同的数据包,通过路由器动态决定数据包的路由,即寻找组播组的地址,只有必要时才赋值数据,然后将数据发送到

这个组的每一个主机中。它可以大大提高数据传送效率,减少了骨干网络出现网络拥塞的可能性。比前两种方式效率都

很好。

下面来演示一下使用Java Socket的组播类实现一个组播的小案例

首先是接收端

package com.bird.test;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Date;

/**
 * 组播的客户端
 * @author Bird
 *
 */
public class MulticastReceive {

	
	public static void main(String[] args) throws Exception {
		test();
	}
	
	public static void test() throws Exception{
		InetAddress group = InetAddress.getByName("224.0.0.2");//组播地址
		int port = 8888;
		MulticastSocket msr = null;//创建组播套接字
		try {
			msr = new MulticastSocket(port);
			msr.joinGroup(group);//加入连接
			byte[] buffer = new byte[8192];
			System.out.println("接收数据包启动!(启动时间: "+new Date()+")");
			while(true){
				//建立一个指定缓冲区大小的数据包
				DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
				msr.receive(dp);
				String s = new String(dp.getData(),0,dp.getLength());
				//解码组播数据包
				System.out.println(s);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(msr!=null){
				try {
					msr.leaveGroup(group);
					msr.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		}
	}
	

}

然后是发送端

package com.bird.test;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Date;

/**
 * 组播的服务端
 * @author Bird
 *
 */
public class MulticastSender {
	
	public static void server() throws Exception{
		InetAddress group = InetAddress.getByName("224.0.0.2");//组播地址
		int port = 8888;
		MulticastSocket mss = null;
		try {
			mss = new MulticastSocket(port);
			mss.joinGroup(group);
			System.out.println("发送数据包启动!(启动时间"+new Date()+")");
			
			while(true){
				String message = "Hello "+new Date();
				byte[] buffer = message.getBytes();
				DatagramPacket dp = new DatagramPacket(buffer, buffer.length,group,port);
				mss.send(dp);
				System.out.println("发送数据包给 "+group+":"+port);
				Thread.sleep(1000);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(mss!=null){
					mss.leaveGroup(group);
					mss.close();
				}
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}
	
	public static void main(String[] args) throws Exception {
		server();
	}
}

通过开启多个接收端,然后开启发送端,就可以实现组播的效果

相关文章推荐

【网络编程3】Java组播套接字

这篇博文是本文学习《Java网络程序设计》书中第5章中组播套接字的学习总结。所有源代码都在文章后面我的github链接代码中。 前面两篇博客介绍了发送端程序线程发送单一的消息(通过流套接字和数据报...

Linux网络编程 之 UDP 组播

最近一直在做linux的网络,现在作个总结,陆续贴出来。 在网上搜了很多资料 ,其中周立发的博客对我的学习参考作用最大,谢谢前辈。 直接上代码吧,一个很简单udp 组播通信的例子,分别为服务器端和...

网络编程之 广播 组播 域内套接字

1、网络编程之 广播 组播 域内套接字 2、网络编程之 协议分析 1、广播=====》基于UDP协议形式的消息发送 特点: 必须要发送广播地址  ===》局域网中的网段最大地址...

【二十三】 Linux网络编程——广播与组播

【二十三】      Linux网络编程——广播与组播 /*multicast sender.c*/ #include #include #include #include #incl...

【Linux网络编程】组播代码

//head.h #include #include #include #include #include #include #include #include #include #...
  • wr132
  • wr132
  • 2017年04月12日 20:49
  • 192

Linux网络编程 之 UDP 组播实例

一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。 1、服务器端代码 (multi_udp_server.c) [objc] view plaincopy ...
  • sin0803
  • sin0803
  • 2015年07月09日 11:21
  • 1269

Linux网络编程 之 UDP 组播实例

一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。 1、服务器端代码 (multi_udp_server.c) [objc] view plain...
  • dxpqxb
  • dxpqxb
  • 2014年08月06日 16:34
  • 1289

【Linux网络编程】多播、组播

概述 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组...

JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法

UDP既可以单播也可以组播 一,单播 单播的过程为 发送方: InetAddress destAddr = InetAddress.getByName("192.168.4.199");// 发送的目...
  • kkgbn
  • kkgbn
  • 2016年08月19日 12:13
  • 1483
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java网络编程之组播小案例
举报原因:
原因补充:

(最多只允许输入30个字)