1、使用Jgroups构建集群网技术(P2P)——发现集群中的节点

一、使用Jgroups构建集群网技术(P2P)——发现集群中的节点
通过JGroups可以构建一个P2P集群网,
最初第一步当然是节点的发现,


import java.util.HashMap;
import java.util.Map;

import org.jgroups.Address;
import org.jgroups.ChannelClosedException;
import org.jgroups.ChannelException;
import org.jgroups.ChannelNotConnectedException;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;

public class Peer {
	// key:peer name ,value:src addr
	public Map<String, Address> peerInCluster = new HashMap<String, Address>();
	private JChannel channel;
	private Receive receive;

	public Peer(String name) {
		this.name = name;
		initChannel();
		this.receive = new Receive(channel);
		searchOtherPeer();
	}

	public void initChannel() {
		try {
			if (channel == null) {
				channel = new JChannel();
				channel.connect("ChatCluster");
			}
		} catch (ChannelException e) {
			e.printStackTrace();
		}
	}

	public void searchOtherPeer() {
		try {
			Message msg = new Message(null, null, "Can you hear me" + "@" + name);
			// 发送
			channel.send(msg);
		} catch (ChannelException e) {
			e.printStackTrace();
		}
	}

	class Receive extends ReceiverAdapter {
		JChannel channel;

		public Receive(JChannel channel) {
			this.channel = channel;
			channel.setReceiver(this);
		}

		// 覆盖父类的方法
		@Override
		public void receive(Message msg) {
			if (msg.getSrc().toString().startsWith(channel.getName())) {
				return;
			}
			Object msgInfo = null;
			if ((msgInfo = msg.getObject()) instanceof String) {
				String info = (String) msgInfo;
				System.out.println(msg.getDest() + "****" + msg.getSrc() + "*****");
				String[] infos = info.split("@");
				if (infos[0].equals("Can you hear me")) {
					Address src = null;
					// 尚未记录该节点,是一个新起来的节点
					if ((src = peerInCluster.get(infos[1])) == null) {
						peerInCluster.put(infos[1], (src = msg.getSrc()));
						try {
							channel.send(new Message(src, null, "Can you hear me" + "@" + name));
						} catch (ChannelNotConnectedException e) {
							e.printStackTrace();
						} catch (ChannelClosedException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}

		@Override
		public void viewAccepted(View new_view) {
		}
	}

	// public

	// peer name
	private String name;

	String getName() {
		return name;
	}

	void setName(String name) {
		this.name = name;
	}

	public static void main(String[] args) throws InterruptedException {
		Peer peer = new Peer("hh" + System.currentTimeMillis());
		Peer peer2 = new Peer("boy");
		Peer peer3 = new Peer("girl");
		 Thread.sleep(2000);
		System.out.println(peer.peerInCluster);
		System.out.println(peer2.peerInCluster);
		System.out.println(peer3.peerInCluster);
	}
}




接下来的文章我说一下p2p共享文件的机制。