下面列出了怎么用 io.netty.handler.codec.socksx.v5.Socks5AddressType 的API类实例代码及写法,或者点击链接到github查看源代码。
private void sendConnectCommand(ChannelHandlerContext ctx) throws Exception {
InetSocketAddress raddr = destinationAddress();
Socks5AddressType addrType;
String rhost;
if (raddr.isUnresolved()) {
addrType = Socks5AddressType.DOMAIN;
rhost = raddr.getHostString();
} else {
rhost = raddr.getAddress().getHostAddress();
if (NetUtil.isValidIpV4Address(rhost)) {
addrType = Socks5AddressType.IPv4;
} else if (NetUtil.isValidIpV6Address(rhost)) {
addrType = Socks5AddressType.IPv6;
} else {
throw new ProxyConnectException(
exceptionMessage("unknown address type: " + StringUtil.simpleClassName(rhost)));
}
}
ctx.pipeline().replace(decoderName, decoderName, new Socks5CommandResponseDecoder());
sendToProxyServer(new DefaultSocks5CommandRequest(Socks5CommandType.CONNECT, addrType, rhost, raddr.getPort()));
}
@Override
protected boolean handleProxyProtocol(ChannelHandlerContext ctx, Object msg) throws Exception {
if (!authenticated) {
authenticated = authenticate(ctx, msg);
return false;
}
Socks5CommandRequest req = (Socks5CommandRequest) msg;
assertThat(req.type(), is(Socks5CommandType.CONNECT));
Socks5CommandResponse res =
new DefaultSocks5CommandResponse(Socks5CommandStatus.SUCCESS, Socks5AddressType.IPv4);
intermediaryDestination = SocketUtils.socketAddress(req.dstAddr(), req.dstPort());
ctx.write(res);
ctx.pipeline().remove(ENCODER);
ctx.pipeline().remove(DECODER);
return true;
}
@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 Future<?> execute() {
InetSocketAddress destinationAddress = unresolvedAddressFor(serverHostAndPort);
DefaultSocks5CommandRequest connectRequest = new DefaultSocks5CommandRequest(
Socks5CommandType.CONNECT, Socks5AddressType.DOMAIN, destinationAddress.getHostString(), destinationAddress.getPort());
addFirstOrReplaceHandler(SOCKS_DECODER_NAME, new Socks5CommandResponseDecoder());
return writeToChannel(connectRequest);
}