#java #sockets #proxy
#java #сокеты #прокси
Вопрос:
Я пишу очень простое транспортное моделирование (пожалуйста, не спрашивайте, почему я использую этот подход, на самом деле это не суть моего вопроса).
У меня запущено три потока (хотя вы могли бы рассматривать их как отдельные программы). Один в качестве клиента, один в качестве сервера и один в качестве прокси.
Первый используется в качестве клиента, и основной код для этого приведен здесь:
try {
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(InetAddress.getLocalHost(), 4466));
Socket socket = new Socket(proxy);
InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getLocalHost(), 4456);
socket.connect(socketAddress);
// send data
for (String straat : straten) {
socket.getOutputStream().write(straat.getBytes());
}
socket.getOutputStream().flush();
socket.getOutputStream().close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
Второй — это серверная часть, приведенная здесь:
public void run() {
try {
ServerSocket ss = new ServerSocket(4456);
Socket s = ss.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(s.getInputStream()));
String incoming;
while ((incoming = in.readLine()) != null) {
panel.append(incoming "n");
}
panel.append("n");
s.getInputStream().close();
s.close();
ss.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
И затем есть прокси-поток:
public void run() {
try {
ServerSocket ss = new ServerSocket(4466);
Socket s = ss.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(s.getInputStream()));
panel.append(verzenderId "n");
String incoming;
while ((incoming = in.readLine()) != null) {
panel.append(incoming "n");
}
panel.append("n");
s.getInputStream().close();
s.close();
ss.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Так или иначе, это не сработает. Сообщение отправляется непосредственно на сервер, и прокси не получает никаких запросов сокета.
Как я могу заставить это работать так, чтобы порт 4466 стал прокси-сервером для связи между клиентским потоком и серверным потоком?
Цель состоит в том, чтобы превратить этот сокет между клиентом и сервером в SSLSocket, чтобы прокси не мог прочитать ничего, что проходит через него. Следовательно, настройка двух сокетов, одного между клиентом и прокси-сервером и одного между прокси-сервером, — это не то решение, которое я ищу.
Заранее большое спасибо.
Комментарии:
1. Разве «прокси» не должен реализовывать протокол SOCKS, чтобы это работало? Смотрите en.wikipedia.org/wiki/SOCKS
2. Основываясь на коде, невозможно определить, к какому серверу подключается ваш клиент. Откуда вы знаете, что он подключается напрямую к порту 4465, а не к 4466?
3. Вы имеете в виду, что я должен добавить некоторые дополнительные функции в поток прокси? Поскольку на стороне клиента я действительно пишу, что это SOCKS-прокси (см. Первую строку)
4. Что ж, если вы хотите взаимодействовать через прокси-сервер SOCKS, вы должны реализовать протокол SOCKS в потоке вашего прокси-сервера. Хотя просто для того, чтобы проверить, к какому порту что-либо подключается, вам не нужно этого делать.
5. @nos: оба находятся на локальном хостинге (поскольку это одно и то же приложение). Прокси-сервер прослушивает порт 4466, сервер прослушивает порт 4456. В клиенте я указываю, что соединение должно быть между клиентом и портом 4456, проходящим через прокси в порту 4466.