На самом деле это довольно просто реализовать в Java.Приложение Tunneler на устройстве открывает два соединения, одно с сервером и одно со службой на устройстве.Теперь, если вы используете Input- / OutputStreams (в отличие от nio Channels), вам нужны 2 потока, каждый из которых читает один из InputStreams, и просто записывает все, что они получили, в противоположный поток вывода.На сервере вам понадобится аналогичный процесс, который получает два соединения от ServerSocket.accept и должен быть в состоянии выяснить, какой из них является туннелем, а какой - клиентом службы (т. Е. Проверяет заголовок протокола туннелирования навходящие соединения).
Это становится немного сложнее, если вы хотите иметь возможность туннелировать несколько соединений одновременно.Вам нужно будет реализовать какой-то протокол для этого, чтобы иметь возможность отправлять туннелированные пакеты на несколько соединений на устройстве, если вы хотите избежать открытия нескольких туннельных соединений.