09zookeeper简单应答系统--客户端实现

  • 简单应答系统提供功能:时间查询(每隔两秒服务器返回一次时间)

     import java.io.IOException;
     import java.io.InputStream;
     import java.io.OutputStream;
     import java.net.Socket;
     import java.util.ArrayList;
     import java.util.List;
     import java.util.Random;
     import org.apache.zookeeper.KeeperException;
     import org.apache.zookeeper.WatchedEvent;
     import org.apache.zookeeper.Watcher;
     import org.apache.zookeeper.Watcher.Event.EventType;
     import org.apache.zookeeper.Watcher.Event.KeeperState;
     import org.apache.zookeeper.ZooKeeper;
     
     public class Consumer {
     
     //定义一个list用来存放最新的在线服务器列表
     private ArrayList<String> onlineServers = new ArrayList<>();
     
     //构造zk连接对象
     ZooKeeper zk = null;
     
     //构造zk端连接
     public void connectZK() throws Exception {
     	zk = new ZooKeeper("node01:2181,node02:2181,node03:2181", 2000, new Watcher() {
     		
     		@Override
     		public void process(WatchedEvent event) {
     			//判断连接成功并且子节点变化时才执行
     			if(event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeChildrenChanged) {
     				try {
     					//事件回调逻辑中,再次查询zk上的在线服务器节点即可,查询逻辑中又再次注册了子节点变化事件监听。
     					getOnlineServers();
     				} catch (Exception e) {
     					e.printStackTrace();
     				}
     			}
     		}
     	});
     }
     
     //查询在线服务器列表
     public void getOnlineServers() throws Exception {
     	List<String> children = zk.getChildren("/servers", true);
     	ArrayList<String> servers = new ArrayList<>();
     	for (String child : children) {
     		byte[] data = zk.getData("/servers/"+child, false, null);
     		String serverInfo = new String(data);
     		servers.add(serverInfo);
     	}
     	onlineServers = servers;
     	System.out.println("查询了一次zk,当前在线的服务器有: " + servers);
     }
     
     
     //处理业务(向一台服务器发送时间查询请求)
     public void sendRequest() throws Exception {
     	Random random = new Random();
     	while(true) {
     		try{  
     		//挑选一台当前在线的服务器
     		int nextInt = random.nextInt(onlineServers.size());
     		String server = onlineServers.get(nextInt);
     		String hostname = server.split(":")[0];
     		int port = Integer.parseInt(server.split(":")[1]);
     		System.out.println("本次请求挑选的服务器为:" + server);
     		
     		Socket socket = new Socket(hostname, port);
     		OutputStream out = socket.getOutputStream();
     		InputStream in = socket.getInputStream();
     		
     		out.write("haha".getBytes());
     		out.flush();
     		
     		byte[] buf = new byte[255];
     		int read = in.read(buf);
     		System.out.println("服务器响应时间为:" + new String(buf, 0, read));
     		
     		out.close();
     		in.close();
     		socket.close();
     		
     		Thread.sleep(2000);
     		}catch(Exception e){
     			e.printStackTrace();
     		}
     	}
     }
     
     
     
     public static void main(String[] args) throws Exception {
     	
     	Consumer consumer = new Consumer();
     	
     	//构造zk连接对象
     	consumer.connectZK();
     	
     	//查询在线服务器列表
     	consumer.getOnlineServers();
     	
     	//处理业务(向一台服务器发送时间查询请求)
     	consumer.sendRequest();
     	
     }
    
     }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hao难懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值