Java HTTP Proxy Tunneling プログラムを作成しようとしていますが、通信に使用する最適かつ最速のストリームについて専門家のアドバイスが必要です。
基本的な機能を実装しましたが、すべて正常に動作します。唯一の問題は、通信速度またはパフォーマンスです。私の HTTP プロキシ システムは、リモート サーバー上で実行されるサーバー プログラムと、ローカル マシン上で実行されるクライアント プログラムで構成されています。これまでのところ、プログラムは次のようになります。
Listener.java :
/**
* Listens and accepts connection requests from the browser
*/
ServerSocket listener = null;
try {
listener = new ServerSocket(port, 128);
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
ExecutorService executor = Executors.newCachedThreadPool();
Socket connection;
while (!shutdown) {
try {
connection = listener.accept();
executor.execute(new ProxyTunnel(connection));
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}
ProxyTunnel.java :
try {
byte[] buffer = new byte[8192]; // 8-KB buffer
InputStream browserInput = browser.getInputStream();
OutputStream browserOutput = browser.getOutputStream();
// Reading browser request ...
StringBuilder request = new StringBuilder(2048);
do {
int read = browserInput.read(buffer);
logger.log(read + " bytes read from browser.");
if (read > 0) {
request.append(new String(buffer, 0, read));
}
} while (browserInput.available() > 0 && read > 0);
// Connecting to proxy server ...
Socket server = new Socket(SERVER_IP, SERVER_PORT);
server.setSoTimeout(5000); // Setting 5 sec read timeout
OutputStream serverOutput = server.getOutputStream();
InputStream serverInput = server.getInputStream();
// Sending request to server ...
serverOutput.write(request.toString().getBytes());
serverOutput.flush();
// Waiting for server response ...
StringBuilder response = new StringBuilder(16384);
do {
try {
read = serverInput.read(buffer);
} catch (SocketTimeoutException ex) {
break; // Timeout!
}
if (read > 0) {
// Send response to browser.");
response.append(new String(buffer, 0, read));
browserOutput.write(buffer, 0, read);
browserOutput.flush();
}
} while (read > 0);
// Closing connections ...
server.close();
} catch (IOException ex) {
ex.printStackTrace(System.err);
} finally {
try {
browser.close();
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}
サーバー プログラムは同様の方法を使用して、HTTP 要求を宛先サーバー (www.stackoverflow.com など) に送信し、応答をクライアント プログラムに転送します。クライアント プログラムは応答をローカル ブラウザーに転送します。
- これらの TCP/HTTP 通信のパフォーマンスを改善するにはどうすればよいですか?
- やなどのバッファ付きストリームを使用する
BufferedInputSream
とBufferedOutputStream
、通信パフォーマンスが向上しますか? - ソケットとストリーム
java.nio
の代わりにチャネルとバッファを使用すると、パフォーマンスが向上しますか?java.net
java.io