@Override public void channelRead0(ChannelHandlerContext ctx, Object msg) { try { System.out.println("接收到了数据"); M2mWebPacket m2mPacket = (M2mWebPacket) msg; int operateType = m2mPacket.getM2mRequestHeader().getType(); System.out.println(operateType + "操作类型"); if (operateType == OperateCode.getStatus.getCode()) { try { lookAllServerStatus(m2mPacket, ctx); } catch (IOException e) { if (LOG.isInfoEnabled()) { LOG.error("channelRead is error:because of:{}", e.getMessage()); } } } else if (operateType == OperateCode.retriveLocalKey.getCode()) { // 查看本地是否包含一个key String key = m2mPacket.getM2mRequestHeader().getKey(); if (key == null) { if (LOG.isInfoEnabled()) { LOG.info("key is null"); } } final ConcurrentHashMap<String, ZooKeeperServer> zookeeperServers = serverCnxnFactory.getZkServers(); Set<String> servers = new HashSet<String>(); for (Entry<String, ZooKeeperServer> entry : zookeeperServers.entrySet()) { ZooKeeperServer zooKeeperServer = entry.getValue(); ZKDatabase zkDatabase = zooKeeperServer.getZKDatabase(); if (zkDatabase.getM2mData().getNodes().containsKey(key)) { servers.add(entry.getKey()); } } m2mPacket.getM2mRequestHeader().setType(OperateCode.ReplyRetriverRemoteKey.getCode()); M2mWebPacket m2mWebPacket = new M2mWebPacket( m2mPacket.getM2mRequestHeader(), m2mPacket.getM2mReplyHeader(), m2mPacket.getRequest(), new M2mWebRetriveKeyResponse(servers)); ctx.writeAndFlush(m2mWebPacket); } else if (operateType == OperateCode.retriveRemoteKey.getCode()) { System.out.println("进入到这里"); String server = networkPool.getSock(m2mPacket.getM2mRequestHeader().getKey()); int zxid = getNextZxid(); result.put(zxid, new RetriveServerAndCtx(ctx, new HashSet<String>())); serverResult.put(zxid, 0); m2mPacket.getM2mRequestHeader().setXid(zxid); m2mPacket.getM2mRequestHeader().setType(OperateCode.retriveLocalKey.getCode()); Long position = networkPool.getServerPosition().get(server); for (int i = 0; i < serverCnxnFactory.getReplicationFactor(); i++) { String address = spilitString(networkPool.getPositionToServer().get(position + i))[0]; Integer webPort = NetworkPool.webPort.get(networkPool.getPositionToServer().get(position + i)); WebTcpClient tcpClient = new WebTcpClient(serverCnxnFactory.getReplicationFactor()); if (webAddressAndPortToChannel.containsKey(address + webPort)) { webAddressAndPortToChannel.get(address + webPort).writeAndFlush(m2mPacket); } else { tcpClient.connectionOne(address, webPort); tcpClient.write(m2mPacket); webAddressAndPortToChannel.put(address + webPort, tcpClient.getChannel()); } } } else { if (LOG.isDebugEnabled()) { LOG.info("invalid operate type : {}", m2mPacket.getM2mRequestHeader().getType()); } } } catch (Exception e) { e.printStackTrace(); } }