/* * Copyright (c) [2016] [ <ether.camp> ] * This file is part of the ethereumJ library. * * The ethereumJ library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The ethereumJ library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>. */ package org.ethereum.net.rlpx.discover; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.nio.NioDatagramChannel; import org.ethereum.crypto.ECKey; import org.ethereum.net.rlpx.*; import org.ethereum.net.rlpx.discover.table.NodeTable; import org.ethereum.util.Functional; import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.List; import java.util.Map; public class MessageHandler extends SimpleChannelInboundHandler<DiscoveryEvent> implements Functional.Consumer<DiscoveryEvent> { static final org.slf4j.Logger logger = LoggerFactory.getLogger("discover"); public Channel channel; NodeManager nodeManager; public MessageHandler(NioDatagramChannel ch, NodeManager nodeManager) { channel = ch; this.nodeManager = nodeManager; } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { nodeManager.channelActivated(); } @Override public void channelRead0(ChannelHandlerContext ctx, DiscoveryEvent event) throws Exception { nodeManager.handleInbound(event); } @Override public void accept(DiscoveryEvent discoveryEvent) { InetSocketAddress address = discoveryEvent.getAddress(); sendPacket(discoveryEvent.getMessage().getPacket(), address); } void sendPacket(byte[] wire, InetSocketAddress address) { DatagramPacket packet = new DatagramPacket(Unpooled.copiedBuffer(wire), address); channel.write(packet); channel.flush(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { logger.debug("Discover channel error" + cause); ctx.close(); // We don't close the channel because we can keep serving requests. } }