Разбираюсь с исходниками http://www.littleshoot.com/littleproxy/ . Это http прокси сервер, написанный на java с использованием netty. К сожалению, он не позволяет выбирать сетевой интерфейс по которому будут идти запросы на сервер. Т.е. мне нужно следующее: в зависимости от запрашиваемого URL запросы идут через разные интерфейсы. С netty я не знаком. За получение соединения отвечает метод класса HttpRequestHandler: | Код | private ChannelFuture newChannelFuture(final HttpRequest httpRequest, final Channel browserToProxyChannel, final String hostAndPort) throws UnknownHostException { final String host; final int port; if (hostAndPort.contains(":")) { host = StringUtils.substringBefore(hostAndPort, ":"); final String portString = StringUtils.substringAfter(hostAndPort, ":"); port = Integer.parseInt(portString); } else { host = hostAndPort; port = 80; } // Configure the client. final ClientBootstrap cb = new ClientBootstrap(this.clientChannelFactory); final ChannelPipelineFactory cpf; if (httpRequest.getMethod() == HttpMethod.CONNECT && !LittleProxyConfig.isUseSSLMitm()) { // In the case of CONNECT, we just want to relay all data in both // directions. We SHOULD make sure this is traffic on a reasonable // port, however, such as 80 or 443, to reduce security risks. cpf = new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { // Create a default pipeline implementation. final ChannelPipeline pipeline = new DefaultChannelPipeline(); pipeline.addLast("handler", new HttpConnectRelayingHandler(browserToProxyChannel, channelGroup)); return pipeline; } }; } else { cpf = relayPipelineFactoryFactory.getRelayPipelineFactory( httpRequest, browserToProxyChannel, this); } cb.setPipelineFactory(cpf); cb.setOption("connectTimeoutMillis", 40*1000); log.debug("Starting new connection to: {}", hostAndPort); ChannelFuture cf; if (LittleProxyConfig.isUseDnsSec()) { cf = cb.connect(VerifiedAddressFactory.newInetSocketAddress(host, port, LittleProxyConfig.isUseDnsSec())); }else { final InetAddress ia = InetAddress.getByName(host); final String address = ia.getHostAddress(); try{ /*мой код, здесь я пытаюсь выбрать сетевой интерфейс для отправки сообщения на сервер*/ NetworkInterface nif = NetworkInterface.getByName("neth2"); DatagramChannel channel = (DatagramChannel) cb.bind( new InetSocketAddress( "192.168.1.100", 80) ); InetSocketAddress addr = new InetSocketAddress(address, port); cf = channel.joinGroup(addr,nif); /**/ }catch(IOException e){ cf = cb.connect(new InetSocketAddress(address, port)); e.printStackTrace(); } } allChannelFutures.add(cf); return cf; }
|
Естественно, ничего не происходят, данные от сервера не приходят. Вопрос: Как сделать правильно? Это сообщение отредактировал(а) vadkasevas - 9.7.2013, 05:24
|