diff --git a/pom.xml b/pom.xml
index 98dddff..fe97e01 100644
--- a/pom.xml
+++ b/pom.xml
@@ -264,7 +264,7 @@
io.netty
netty-all
- 4.0.14.Beta1
+ 4.0.9.Final
compile
diff --git a/src/main/java/com/torrent4j/TestMain.java b/src/main/java/com/torrent4j/TestMain.java
index 33a6f99..3a146c1 100644
--- a/src/main/java/com/torrent4j/TestMain.java
+++ b/src/main/java/com/torrent4j/TestMain.java
@@ -21,7 +21,7 @@ public class TestMain {
new PeerWireProtocol(), new InMemoryTorrentStorage());
controller.start(1234);
- final Torrent torrent = Torrent.load(Paths.get("test.torrent"));
+ final Torrent torrent = Torrent.load(Paths.get("Black Lab - This Night.mp3.torrent"));
System.out.println("Torrent hash is " + torrent.getHash().getString());
// controller.checkExistingData(torrent);
@@ -29,7 +29,7 @@ public class TestMain {
controller.registerTorrent(torrent);
final TorrentPeer peer = new TorrentPeer(torrent);
peer.setAddress(new InetSocketAddress(Inet4Address
- .getByName("127.0.0.1"), 34096));
+ .getByName("127.0.0.1"), 63098));
torrent.getSwarm().addPeer(peer);
while(true) {
diff --git a/src/main/java/com/torrent4j/model/Torrent.java b/src/main/java/com/torrent4j/model/Torrent.java
index ffe0b1c..f52a1a8 100644
--- a/src/main/java/com/torrent4j/model/Torrent.java
+++ b/src/main/java/com/torrent4j/model/Torrent.java
@@ -296,9 +296,11 @@ public class Torrent {
* if any error occur while reading the torrent file
*/
public static Torrent load(InputStream in) throws IOException {
- final Object node = new BDecoder(in).readElement();
- final TorrentMetadata metadata = new TorrentMetadata((BMap) node);
- return new Torrent(metadata);
+ try(BDecoder bin = new BDecoder(in)) {
+ final Object node = bin.readElement();
+ final TorrentMetadata metadata = new TorrentMetadata((BMap) node);
+ return new Torrent(metadata);
+ }
}
/**
diff --git a/src/main/java/com/torrent4j/model/peer/TorrentPeer.java b/src/main/java/com/torrent4j/model/peer/TorrentPeer.java
index 31d1920..6af5a9f 100644
--- a/src/main/java/com/torrent4j/model/peer/TorrentPeer.java
+++ b/src/main/java/com/torrent4j/model/peer/TorrentPeer.java
@@ -187,7 +187,7 @@ public class TorrentPeer {
// NETWORK RELATED THINGS!
public void handshake() {
- // FIXME sent another peer id
+ // FIXME send another peer id
protocolPeer.handshake(torrent.getHash().getHash(), torrent
.getController().getConfig().getPeerID());
}
diff --git a/src/main/java/com/torrent4j/net/peerwire/AbstractPeerWireMessage.java b/src/main/java/com/torrent4j/net/peerwire/AbstractPeerWireMessage.java
index 0b5cff3..f41ea1c 100644
--- a/src/main/java/com/torrent4j/net/peerwire/AbstractPeerWireMessage.java
+++ b/src/main/java/com/torrent4j/net/peerwire/AbstractPeerWireMessage.java
@@ -1,6 +1,6 @@
package com.torrent4j.net.peerwire;
-import io.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
public abstract class AbstractPeerWireMessage implements PeerWireMessage {
public final int messageID;
@@ -10,19 +10,19 @@ public abstract class AbstractPeerWireMessage implements PeerWireMessage {
}
@Override
- public final void write(ChannelBuffer buffer) {
+ public final void write(ByteBuf buffer) {
buffer.writeByte(messageID);
writeImpl(buffer);
}
- public void writeImpl(ChannelBuffer buffer) {
+ public void writeImpl(ByteBuf buffer) {
}
@Override
- public final void read(ChannelBuffer buffer) {
+ public final void read(ByteBuf buffer) {
readImpl(buffer);
}
- public void readImpl(ChannelBuffer buffer) {
+ public void readImpl(ByteBuf buffer) {
}
}
diff --git a/src/main/java/com/torrent4j/net/peerwire/PeerWirePipelineFactory.java b/src/main/java/com/torrent4j/net/peerwire/PeerWireChannelInitializer.java
similarity index 55%
rename from src/main/java/com/torrent4j/net/peerwire/PeerWirePipelineFactory.java
rename to src/main/java/com/torrent4j/net/peerwire/PeerWireChannelInitializer.java
index 9a9982e..5a817c5 100644
--- a/src/main/java/com/torrent4j/net/peerwire/PeerWirePipelineFactory.java
+++ b/src/main/java/com/torrent4j/net/peerwire/PeerWireChannelInitializer.java
@@ -1,12 +1,12 @@
package com.torrent4j.net.peerwire;
-import static io.netty.channel.Channels.pipeline;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
-import io.netty.channel.ChannelPipelineFactory;
+import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
-import io.netty.logging.InternalLogLevel;
-import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
import com.torrent4j.TorrentController;
import com.torrent4j.net.peerwire.codec.PeerWireFrameDecoder;
@@ -16,22 +16,22 @@ import com.torrent4j.net.peerwire.codec.PeerWireMessageEncoder;
import com.torrent4j.net.peerwire.traffic.PeerTrafficShapingHandler;
import com.torrent4j.net.peerwire.traffic.TorrentTrafficShapingHandler;
-public class PeerWirePipelineFactory implements ChannelPipelineFactory {
+public class PeerWireChannelInitializer extends ChannelInitializer {
private final TorrentController controller;
- private final Executor executor;
+ private final ScheduledExecutorService executor;
- public PeerWirePipelineFactory(TorrentController controller,
- Executor executor) {
+ public PeerWireChannelInitializer(TorrentController controller,
+ ScheduledExecutorService executor) {
this.controller = controller;
this.executor = executor;
}
@Override
- public ChannelPipeline getPipeline() throws Exception {
- final ChannelPipeline p = pipeline();
-
+ protected void initChannel(Channel ch) throws Exception {
+ final ChannelPipeline p = ch.pipeline();
+
p.addLast("torrent-shaper", new TorrentTrafficShapingHandler(executor));
- p.addLast("traffic-shaper", new PeerTrafficShapingHandler(executor));
+ p.addLast("traffic-shaper", new PeerTrafficShapingHandler());
p.addLast("frame-decoder", new PeerWireFrameDecoder());
p.addLast("frame-encoder", new PeerWireFrameEncoder());
@@ -39,10 +39,9 @@ public class PeerWirePipelineFactory implements ChannelPipelineFactory {
p.addLast("message-decoder", new PeerWireMessageDecoder());
p.addLast("message-encoder", new PeerWireMessageEncoder());
- p.addLast("logging", new LoggingHandler(InternalLogLevel.WARN));
+ p.addLast("logging", new LoggingHandler(LogLevel.WARN));
- p.addLast("handler", new PeerWireHandler(controller));
-
- return p;
+ p.addLast("in-handler", new PeerWireInboundHandler(controller));
+ p.addLast("out-handler", new PeerWireOutboundHandler(controller));
}
}
diff --git a/src/main/java/com/torrent4j/net/peerwire/PeerWireHandler.java b/src/main/java/com/torrent4j/net/peerwire/PeerWireInboundHandler.java
similarity index 63%
rename from src/main/java/com/torrent4j/net/peerwire/PeerWireHandler.java
rename to src/main/java/com/torrent4j/net/peerwire/PeerWireInboundHandler.java
index a4d7105..de6a15f 100644
--- a/src/main/java/com/torrent4j/net/peerwire/PeerWireHandler.java
+++ b/src/main/java/com/torrent4j/net/peerwire/PeerWireInboundHandler.java
@@ -1,25 +1,20 @@
package com.torrent4j.net.peerwire;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.MessageEvent;
-import io.netty.channel.SimpleChannelHandler;
+import io.netty.channel.ChannelInboundHandlerAdapter;
import java.net.InetSocketAddress;
import java.util.Date;
import com.torrent4j.TorrentController;
import com.torrent4j.model.Torrent;
+import com.torrent4j.model.TorrentPiece;
+import com.torrent4j.model.TorrentPieceBlock;
import com.torrent4j.model.peer.TorrentPeer;
import com.torrent4j.model.peer.TorrentPeerChoking;
import com.torrent4j.model.peer.TorrentPeerInterest;
-import com.torrent4j.model.TorrentPiece;
-import com.torrent4j.model.TorrentPieceBlock;
import com.torrent4j.net.peerwire.codec.PeerWireFrameDecoder;
-import com.torrent4j.net.peerwire.codec.PeerWireFrameEncoder;
import com.torrent4j.net.peerwire.codec.PeerWireMessageDecoder;
-import com.torrent4j.net.peerwire.codec.PeerWireMessageEncoder;
import com.torrent4j.net.peerwire.messages.BitFieldMessage;
import com.torrent4j.net.peerwire.messages.BlockMessage;
import com.torrent4j.net.peerwire.messages.CancelMessage;
@@ -35,52 +30,51 @@ import com.torrent4j.net.peerwire.traffic.TorrentTrafficShapingHandler;
import com.torrent4j.util.Hash;
import com.torrent4j.util.HashType;
-public class PeerWireHandler extends SimpleChannelHandler {
+public class PeerWireInboundHandler extends ChannelInboundHandlerAdapter {
private final TorrentController controller;
private PeerWireProtocolPeer peer;
- public PeerWireHandler(TorrentController controller) {
+ public PeerWireInboundHandler(TorrentController controller) {
this.controller = controller;
}
@Override
- public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
+ public void channelRead(ChannelHandlerContext ctx, Object msg)
throws Exception {
try {
- final Object msg = e.getMessage();
if (!(msg instanceof PeerWireMessage))
return;
if (msg instanceof HandshakeMessage) {
final HandshakeMessage message = (HandshakeMessage) msg;
- ((PeerWireFrameDecoder) e.getChannel().getPipeline()
+ ((PeerWireFrameDecoder) ctx.channel().pipeline()
.get("frame-decoder")).setHandshaked(true);
- ((PeerWireMessageDecoder) e.getChannel().getPipeline()
+ ((PeerWireMessageDecoder) ctx.channel().pipeline()
.get("message-decoder")).setHandshaked(true);
final Hash hash = new Hash(HashType.SHA1, message.torrentHash);
final Torrent torrent = controller.findTorrent(hash);
if (torrent == null) {
- e.getChannel().disconnect();
+ ctx.channel().disconnect();
return;
}
TorrentPeer peer = torrent.getSwarm().findPeer(
- (InetSocketAddress) e.getChannel().getRemoteAddress(),
+ (InetSocketAddress) ctx.channel().remoteAddress(),
message.peerID);
if (peer == null) {
peer = new TorrentPeer(torrent);
- peer.setAddress((InetSocketAddress) e.getChannel()
- .getRemoteAddress());
+ peer.setAddress((InetSocketAddress) ctx.channel()
+ .remoteAddress());
}
peer.setPeerID(message.peerID);
this.peer = (PeerWireProtocolPeer) peer.getProtocolPeer();
- e.getChannel().getPipeline()
+ ctx.channel().pipeline()
.get(PeerTrafficShapingHandler.class).setPeer(peer);
- e.getChannel().getPipeline()
+ ctx.channel().pipeline()
.get(TorrentTrafficShapingHandler.class)
.setTorrent(torrent);
@@ -209,93 +203,7 @@ public class PeerWireHandler extends SimpleChannelHandler {
System.out.println(msg);
}
} finally {
- ctx.sendUpstream(e);
+ super.channelRead(ctx, msg);
}
}
-
- @Override
- public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)
- throws Exception {
- try {
- final Object msg = e.getMessage();
- if (!(msg instanceof PeerWireMessage))
- return;
- if (msg instanceof HandshakeMessage) {
- e.getFuture().addListener(new ChannelFutureListener() {
- @Override
- public void operationComplete(ChannelFuture future)
- throws Exception {
- ((PeerWireFrameEncoder) future.getChannel()
- .getPipeline().get("frame-encoder"))
- .setHandshaked(true);
- ((PeerWireMessageEncoder) future.getChannel()
- .getPipeline().get("message-encoder"))
- .setHandshaked(true);
- }
- });
- } else if (msg instanceof BlockMessage) {
- final BlockMessage message = (BlockMessage) msg;
-
- final TorrentPiece piece = peer.getTorrent().getPiece(
- message.pieceIndex);
- final TorrentPieceBlock block = piece.getBlock(message.begin,
- message.data.remaining());
-
- peer.getTorrentPeer().getState().setLastUploadedBlock(block);
- peer.getTorrentPeer().getState()
- .setLastUploadedBlockDate(new Date());
-
- e.getFuture().addListener(new ChannelFutureListener() {
- @Override
- public void operationComplete(ChannelFuture future)
- throws Exception {
- if (!future.isSuccess())
- return;
- peer.getTorrentPeer().getState()
- .setUploadRequestedBlock(null);
- peer.getTorrentPeer().getState()
- .setUploadRequestedDate(null);
- }
- });
- } else if (msg instanceof RequestMessage) {
- final RequestMessage message = (RequestMessage) msg;
-
- final TorrentPiece piece = peer.getTorrent().getPiece(
- message.pieceIndex);
- final TorrentPieceBlock block = piece.getBlock(message.begin,
- message.length);
-
- peer.getTorrentPeer().getState()
- .setDownloadRequestedBlock(block);
- peer.getTorrentPeer().getState()
- .setDownloadRequestedDate(new Date());
- } else if (msg instanceof CancelMessage) {
- e.getFuture().addListener(new ChannelFutureListener() {
- @Override
- public void operationComplete(ChannelFuture future)
- throws Exception {
- if (!future.isSuccess())
- return;
- peer.getTorrentPeer().getState()
- .setDownloadRequestedBlock(null);
- peer.getTorrentPeer().getState()
- .setDownloadRequestedDate(null);
- }
- });
- }
- } finally {
- ctx.sendDownstream(e);
- }
- }
-
- // @Override
- // public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent
- // e)
- // throws Exception {
- // try {
- // peer = new PeerWireProtocolPeer(e.getChannel());
- // } finally {
- // ctx.sendUpstream(e);
- // }
- // }
}
diff --git a/src/main/java/com/torrent4j/net/peerwire/PeerWireMessage.java b/src/main/java/com/torrent4j/net/peerwire/PeerWireMessage.java
index bcb98df..388a567 100644
--- a/src/main/java/com/torrent4j/net/peerwire/PeerWireMessage.java
+++ b/src/main/java/com/torrent4j/net/peerwire/PeerWireMessage.java
@@ -1,9 +1,9 @@
package com.torrent4j.net.peerwire;
-import io.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
public interface PeerWireMessage {
- void write(ChannelBuffer buffer);
+ void write(ByteBuf buffer);
- void read(ChannelBuffer buffer);
+ void read(ByteBuf buffer);
}
diff --git a/src/main/java/com/torrent4j/net/peerwire/PeerWireOutboundHandler.java b/src/main/java/com/torrent4j/net/peerwire/PeerWireOutboundHandler.java
new file mode 100644
index 0000000..51cd6b1
--- /dev/null
+++ b/src/main/java/com/torrent4j/net/peerwire/PeerWireOutboundHandler.java
@@ -0,0 +1,103 @@
+package com.torrent4j.net.peerwire;
+
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelOutboundHandlerAdapter;
+import io.netty.channel.ChannelPromise;
+
+import java.util.Date;
+
+import com.torrent4j.TorrentController;
+import com.torrent4j.model.TorrentPiece;
+import com.torrent4j.model.TorrentPieceBlock;
+import com.torrent4j.net.peerwire.codec.PeerWireFrameEncoder;
+import com.torrent4j.net.peerwire.codec.PeerWireMessageEncoder;
+import com.torrent4j.net.peerwire.messages.BlockMessage;
+import com.torrent4j.net.peerwire.messages.CancelMessage;
+import com.torrent4j.net.peerwire.messages.HandshakeMessage;
+import com.torrent4j.net.peerwire.messages.RequestMessage;
+
+public class PeerWireOutboundHandler extends ChannelOutboundHandlerAdapter {
+ @SuppressWarnings("unused")
+ private final TorrentController controller;
+ private PeerWireProtocolPeer peer;
+
+ public PeerWireOutboundHandler(TorrentController controller) {
+ this.controller = controller;
+ }
+
+ @Override
+ public void write(ChannelHandlerContext ctx, Object msg,
+ ChannelPromise promise) throws Exception {
+ try {
+ if (!(msg instanceof PeerWireMessage))
+ return;
+ if (msg instanceof HandshakeMessage) {
+ promise.addListener(new ChannelFutureListener() {
+ @Override
+ public void operationComplete(ChannelFuture future)
+ throws Exception {
+ ((PeerWireFrameEncoder) future.channel()
+ .pipeline().get("frame-encoder"))
+ .setHandshaked(true);
+ ((PeerWireMessageEncoder) future.channel()
+ .pipeline().get("message-encoder"))
+ .setHandshaked(true);
+ }
+ });
+ } else if (msg instanceof BlockMessage) {
+ final BlockMessage message = (BlockMessage) msg;
+
+ final TorrentPiece piece = peer.getTorrent().getPiece(
+ message.pieceIndex);
+ final TorrentPieceBlock block = piece.getBlock(message.begin,
+ message.data.remaining());
+
+ peer.getTorrentPeer().getState().setLastUploadedBlock(block);
+ peer.getTorrentPeer().getState()
+ .setLastUploadedBlockDate(new Date());
+
+ promise.addListener(new ChannelFutureListener() {
+ @Override
+ public void operationComplete(ChannelFuture future)
+ throws Exception {
+ if (!future.isSuccess())
+ return;
+ peer.getTorrentPeer().getState()
+ .setUploadRequestedBlock(null);
+ peer.getTorrentPeer().getState()
+ .setUploadRequestedDate(null);
+ }
+ });
+ } else if (msg instanceof RequestMessage) {
+ final RequestMessage message = (RequestMessage) msg;
+
+ final TorrentPiece piece = peer.getTorrent().getPiece(
+ message.pieceIndex);
+ final TorrentPieceBlock block = piece.getBlock(message.begin,
+ message.length);
+
+ peer.getTorrentPeer().getState()
+ .setDownloadRequestedBlock(block);
+ peer.getTorrentPeer().getState()
+ .setDownloadRequestedDate(new Date());
+ } else if (msg instanceof CancelMessage) {
+ promise.addListener(new ChannelFutureListener() {
+ @Override
+ public void operationComplete(ChannelFuture future)
+ throws Exception {
+ if (!future.isSuccess())
+ return;
+ peer.getTorrentPeer().getState()
+ .setDownloadRequestedBlock(null);
+ peer.getTorrentPeer().getState()
+ .setDownloadRequestedDate(null);
+ }
+ });
+ }
+ } finally {
+ super.write(ctx, msg, promise);
+ }
+ }
+}
diff --git a/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocol.java b/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocol.java
index ae8f93c..ecb644c 100644
--- a/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocol.java
+++ b/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocol.java
@@ -1,51 +1,63 @@
package com.torrent4j.net.peerwire;
-import io.netty.bootstrap.ClientBootstrap;
+import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
-import io.netty.channel.socket.nio.NioClientSocketChannelFactory;
-import io.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
-import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
import com.torrent4j.TorrentController;
import com.torrent4j.model.peer.TorrentPeer;
import com.torrent4j.net.TorrentProtocol;
public class PeerWireProtocol implements TorrentProtocol {
- private final Executor threadPool = Executors.newCachedThreadPool();
+ private final ScheduledExecutorService threadPool = Executors
+ .newScheduledThreadPool(1);
- private final ServerBootstrap serverBootstrap = new ServerBootstrap(
- new NioServerSocketChannelFactory(threadPool, threadPool));
- private final ClientBootstrap clientBootstrap = new ClientBootstrap(
- new NioClientSocketChannelFactory(threadPool, threadPool));
+ private final EventLoopGroup bossGroup = new NioEventLoopGroup();
+ private final EventLoopGroup workerGroup = new NioEventLoopGroup();
- private Channel serverChannel;
+ private final ServerBootstrap serverBootstrap = new ServerBootstrap();
+ private final Bootstrap clientBootstrap = new Bootstrap();
+
+ private NioServerSocketChannel serverChannel;
@Override
public void start(TorrentController controller, int listenPort) {
- serverBootstrap.setPipelineFactory(new PeerWirePipelineFactory(
- controller, threadPool));
- clientBootstrap.setPipelineFactory(new PeerWirePipelineFactory(
- controller, threadPool));
+ serverBootstrap
+ .group(bossGroup, workerGroup)
+ .channel(NioServerSocketChannel.class)
+ .option(ChannelOption.SO_BACKLOG, 100)
+ .localAddress(listenPort)
+ .childOption(ChannelOption.TCP_NODELAY, true)
+ .childHandler(
+ new PeerWireChannelInitializer(controller, threadPool)).validate();
+ clientBootstrap
+ .group(workerGroup)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 100)
+ //.option(ChannelOption.SO_BACKLOG, 100)
+ .handler(new PeerWireChannelInitializer(controller, threadPool)).validate();
try {
- serverChannel = serverBootstrap.bind(new InetSocketAddress(
- Inet4Address.getByName("0.0.0.0"), listenPort));
+ serverChannel = (NioServerSocketChannel) serverBootstrap.bind(new InetSocketAddress(
+ Inet4Address.getByName("0.0.0.0"), listenPort)).channel();
} catch (UnknownHostException e) {
}
}
@Override
public void stop() {
- clientBootstrap.releaseExternalResources();
serverChannel.close();
- serverBootstrap.releaseExternalResources();
}
@Override
@@ -54,7 +66,7 @@ public class PeerWireProtocol implements TorrentProtocol {
.awaitUninterruptibly();
if (future.isSuccess()) {
final PeerWireProtocolPeer protocolPeer = new PeerWireProtocolPeer(
- future.getChannel());
+ future.channel());
protocolPeer.setTorrentPeer(peer);
peer.setProtocolPeer(protocolPeer);
return true;
diff --git a/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocolPeer.java b/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocolPeer.java
index c672af4..66eb69c 100644
--- a/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocolPeer.java
+++ b/src/main/java/com/torrent4j/net/peerwire/PeerWireProtocolPeer.java
@@ -33,13 +33,13 @@ public class PeerWireProtocolPeer implements TorrentProtocolPeer {
@Override
public boolean connect() {
- return channel.connect(channel.getRemoteAddress())
+ return channel.connect(channel.remoteAddress())
.awaitUninterruptibly().isSuccess();
}
@Override
public boolean isConnected() {
- return channel.isConnected();
+ return channel.isActive();
}
@Override
diff --git a/src/main/java/com/torrent4j/net/peerwire/codec/PeerWireFrameDecoder.java b/src/main/java/com/torrent4j/net/peerwire/codec/PeerWireFrameDecoder.java
index d31b46b..dcd9e43 100644
--- a/src/main/java/com/torrent4j/net/peerwire/codec/PeerWireFrameDecoder.java
+++ b/src/main/java/com/torrent4j/net/peerwire/codec/PeerWireFrameDecoder.java
@@ -1,36 +1,37 @@
package com.torrent4j.net.peerwire.codec;
-import io.netty.buffer.ChannelBuffer;
-import io.netty.channel.Channel;
+import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.codec.frame.FrameDecoder;
+import io.netty.handler.codec.ByteToMessageDecoder;
-public class PeerWireFrameDecoder extends FrameDecoder {
+import java.util.List;
+
+public class PeerWireFrameDecoder extends ByteToMessageDecoder {
private boolean handshaked = false;
@Override
- protected Object decode(ChannelHandlerContext ctx, Channel channel,
- ChannelBuffer buffer) throws Exception {
+ protected void decode(ChannelHandlerContext ctx, ByteBuf buffer,
+ List