Я создал простое приложение, которое открывает ServerSocket и при подключении подключается к другому сокету сервера на удаленной машине. Для реализации переадресации портов я использую два потока, один из которых читает локальный входной поток и передает его в выходной поток удаленных сокетов, и наоборот.
Реализация выглядит немного неэффективной, и поэтому я спрашиваю вас, знаете ли вы лучшую стратегию реализации, или даже у вас есть какой-то код, чтобы добиться этого эффективным способом.
PS: я знаю, что могу использовать IPTables в Linux, но это должно работать в Windows.
PPS: Если вы опубликуете реализации для этой простой задачи, я создам тест для тестирования всех данных реализаций. Решение должно быть быстрым для многих небольших (~ 100 байт) пакетов и устойчивых потоков данных.
Моя текущая реализация такова (выполняется в каждом из двух потоков для каждого направления):
public static void route(InputStream inputStream, OutputStream outputStream) throws IOException {
byte[] buffer = new byte[65536];
while( true ) {
// Read one byte to block
int b = inputStream.read();
if( b == - 1 ) {
log.info("No data available anymore. Closing stream.");
inputStream.close();
outputStream.close();
return;
}
buffer[0] = (byte)b;
// Read remaining available bytes
b = inputStream.read(buffer, 1, Math.min(inputStream.available(), 65535));
if( b == - 1 ) {
log.info("No data available anymore. Closing stream.");
inputStream.close();
outputStream.close();
return;
}
outputStream.write(buffer, 0, b+1);
}
}