下面列出了怎么用 io.netty.handler.codec.socksx.v5.Socks5CommandRequestDecoder 的API类实例代码及写法,或者点击链接到github查看源代码。
boolean authenticate(ChannelHandlerContext ctx, Object msg) {
if (username == null) {
ctx.pipeline().replace(DECODER, DECODER, new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
return true;
}
if (msg instanceof Socks5InitialRequest) {
ctx.pipeline().replace(DECODER, DECODER, new Socks5PasswordAuthRequestDecoder());
ctx.write(new DefaultSocks5InitialResponse(Socks5AuthMethod.PASSWORD));
return false;
}
Socks5PasswordAuthRequest req = (Socks5PasswordAuthRequest) msg;
if (req.username().equals(username) && req.password().equals(password)) {
ctx.pipeline().replace(DECODER, DECODER, new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.SUCCESS));
return true;
}
ctx.pipeline().replace(DECODER, DECODER, new Socks5PasswordAuthRequestDecoder());
ctx.write(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.FAILURE));
return false;
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, Socks5Message msg) throws Exception {
if (msg instanceof DefaultSocks5InitialRequest) {
ctx.pipeline().addBefore(ctx.name(), Socks5CommandRequestDecoder.class.getName(),
new Socks5CommandRequestDecoder());
ctx.writeAndFlush(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
} else if (msg instanceof DefaultSocks5CommandRequest) {
final DefaultSocks5CommandRequest req = (DefaultSocks5CommandRequest) msg;
ctx.pipeline().remove(Socks5CommandRequestDecoder.class);
ctx.fireUserEventTriggered(new ProxySuccessEvent(
new InetSocketAddress(req.dstAddr(), req.dstPort()),
new DefaultSocks5CommandResponse(Socks5CommandStatus.SUCCESS,
Socks5AddressType.IPv4)));
} else {
throw new IllegalStateException("unexpected msg: " + msg);
}
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, SocksMessage socksMessage)
throws Exception {
switch (socksMessage.version()) {
case SOCKS4a:
Socks4CommandRequest socksV4CmdRequest = (Socks4CommandRequest) socksMessage;
if (socksV4CmdRequest.type() == Socks4CommandType.CONNECT) {
onSocksSuccess(ctx, socksV4CmdRequest);
} else {
ctx.close();
}
break;
case SOCKS5:
if (socksMessage instanceof Socks5InitialRequest) {
ctx.pipeline().addFirst(addChannelHandler(new Socks5CommandRequestDecoder()));
ctx.writeAndFlush(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
} else if (socksMessage instanceof Socks5PasswordAuthRequest) {
ctx.pipeline().addFirst(addChannelHandler(new Socks5CommandRequestDecoder()));
ctx.writeAndFlush(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.SUCCESS));
} else if (socksMessage instanceof Socks5CommandRequest) {
Socks5CommandRequest socks5CmdRequest = (Socks5CommandRequest) socksMessage;
if (socks5CmdRequest.type() == Socks5CommandType.CONNECT) {
onSocksSuccess(ctx, socks5CmdRequest);
} else {
ctx.close();
}
} else {
ctx.close();
}
break;
case UNKNOWN:
ctx.close();
break;
}
}
@Override
public void channelRead0(ChannelHandlerContext ctx, SocksMessage socksRequest) throws Exception {
switch (socksRequest.version()) {
case SOCKS4a:
Socks4CommandRequest socksV4CmdRequest = (Socks4CommandRequest) socksRequest;
if (socksV4CmdRequest.type() == Socks4CommandType.CONNECT) {
ctx.pipeline().addLast(new SocksServerConnectHandler());
ctx.pipeline().remove(this);
ctx.fireChannelRead(socksRequest);
} else {
ctx.close();
}
break;
case SOCKS5:
if (socksRequest instanceof Socks5InitialRequest) {
// auth support example
//ctx.pipeline().addFirst(new Socks5PasswordAuthRequestDecoder());
//ctx.write(new DefaultSocks5AuthMethodResponse(Socks5AuthMethod.PASSWORD));
ctx.pipeline().addFirst(new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
} else if (socksRequest instanceof Socks5PasswordAuthRequest) {
ctx.pipeline().addFirst(new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.SUCCESS));
} else if (socksRequest instanceof Socks5CommandRequest) {
Socks5CommandRequest socks5CmdRequest = (Socks5CommandRequest) socksRequest;
if (socks5CmdRequest.type() == Socks5CommandType.CONNECT) {
ctx.pipeline().addLast(new SocksServerConnectHandler());
ctx.pipeline().remove(this);
ctx.fireChannelRead(socksRequest);
} else {
ctx.close();
}
} else {
ctx.close();
}
break;
case UNKNOWN:
ctx.close();
break;
}
}
public void start() throws Exception {
if(proxyFlowLog == null) {
proxyFlowLog = new ProxyFlowLog4j();
}
if(passwordAuth == null) {
passwordAuth = new PropertiesPasswordAuth();
}
EventLoopGroup boss = new NioEventLoopGroup(2);
EventLoopGroup worker = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss, worker)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
//流量统计
ch.pipeline().addLast(
ProxyChannelTrafficShapingHandler.PROXY_TRAFFIC,
new ProxyChannelTrafficShapingHandler(3000, proxyFlowLog, channelListener)
);
//channel超时处理
ch.pipeline().addLast(new IdleStateHandler(3, 30, 0));
ch.pipeline().addLast(new ProxyIdleHandler());
//netty日志
if(logging) {
ch.pipeline().addLast(new LoggingHandler());
}
//Socks5MessagByteBuf
ch.pipeline().addLast(Socks5ServerEncoder.DEFAULT);
//sock5 init
ch.pipeline().addLast(new Socks5InitialRequestDecoder());
//sock5 init
ch.pipeline().addLast(new Socks5InitialRequestHandler(ProxyServer.this));
if(isAuth()) {
//socks auth
ch.pipeline().addLast(new Socks5PasswordAuthRequestDecoder());
//socks auth
ch.pipeline().addLast(new Socks5PasswordAuthRequestHandler(getPasswordAuth()));
}
//socks connection
ch.pipeline().addLast(new Socks5CommandRequestDecoder());
//Socks connection
ch.pipeline().addLast(new Socks5CommandRequestHandler(ProxyServer.this.getBossGroup()));
}
});
ChannelFuture future = bootstrap.bind(port).sync();
logger.debug("bind port : " + port);
future.channel().closeFuture().sync();
} finally {
boss.shutdownGracefully();
worker.shutdownGracefully();
}
}