Использование сокетов в Java с прокси - PullRequest
4 голосов
/ 18 мая 2011

Я пишу очень простую транспортную симуляцию (пожалуйста, не спрашивайте, почему я использую этот подход, это не совсем мой вопрос).

У меня запущены три потока (хотя вы можете рассматривать их как отдельные программы). Один в качестве клиента, один в качестве сервера и один в качестве прокси.

Первый используется в качестве клиента, и основной код для этого приведен здесь:

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, чтобы прокси-сервер не мог читать все, что проходит через него. Поэтому установка двух сокетов, одного между клиентом и прокси-сервером, а другого между прокси-сервером и сервером, - это не решение, которое я ищу.

Заранее большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...