关闭

Java网络编程之组播小案例

2323人阅读 评论(2) 收藏 举报

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

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

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

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

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

很好。

下面来演示一下使用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();
	}
}

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

11
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1215494次
    • 积分:14604
    • 等级:
    • 排名:第840名
    • 原创:256篇
    • 转载:3篇
    • 译文:2篇
    • 评论:277条
    博主介绍
    github 收集的一些不错的文章

    github
    博客专栏
    最新评论