Использование сокетов в Java с прокси

#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.