powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервер-клиент с пробросом сокета через прокси
20 сообщений из 20, страница 1 из 1
Сервер-клиент с пробросом сокета через прокси
    #39406403
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Экспериментирую с классами ServerSocket и Socket.
написал очень простой пример клиента и сервера:

Сервер
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class DateServer {

    /**
     * Runs the server.
     */
    public static void main(String[] args) throws IOException {
//        Thread.currentThread().isDaemon();
        ServerSocket listener = new ServerSocket(9090);
        try {
            while (true) {
                Socket socket = listener.accept();
                try {
                    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String answer = input.readLine();
                    System.out.println(answer);
                } finally {
                    socket.close();
                }
            }
        }
        finally {
            listener.close();
        }
    }
}



Клиент
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class DateClient {

    /**
     * Runs the client as an application.  First it displays a dialog
     * box asking for the IP address or hostname of a host running
     * the date server, then connects to it and displays the date that
     * it serves.
     */
    public static void main(String[] args) throws IOException {
        String serverAddress = "127.0.0.1";
        Socket s = new Socket(serverAddress, 9090);
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);
                    out.println(JOptionPane.showInputDialog(
                "Введи команду:"));
        System.exit(0);
    }
}



В таком варианте я могу послать с клиента сообщение серверу, и оно пропишется в консоль.
Вопросов 2:
1. Как послать серверу сообщение, если клиент использует Прокси?(http)
2. Как сделать сокет, если между клиентом и сервером маршрутизатор? Мне не очень понятен принцип создания сокета на порте, т.е. как маршрутизатор определит кому отдать поток, если клиентов в его внутренней сети может быть много, и они все могут просить трафик по выбранному порту?

Спасибо.
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39406410
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfio1. Как послать серверу сообщение, если клиент использует Прокси?(http)

Тот код, который приведёт выше это общение по TCP. HTTP прокси требуют протокола HTTP, который в OSI модели находится уровнем выше.

wolfio2. Как сделать сокет, если между клиентом и сервером маршрутизатор?

Одно и второе никак не связаны друг с другом. Возможно стоит перефразировать вопрос. Возможно вы хотели спросить про "соединение"? Маршрутизаторы работают так чтобы обеспечивать соединение прозрачно для клиента и сервера.

wolfioМне не очень понятен принцип создания сокета на порте

Перед тем как погрузится в принципы работы, я бы рекомендовал сначала с терминологией разобраться.
http://stackoverflow.com/questions/152457/what-is-the-difference-between-a-port-and-a-socket

wolfio, т.е. как маршрутизатор определит кому отдать поток, если клиентов в его внутренней сети может быть много, и они все могут просить трафик по выбранному порту?

Это называется NAT.
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39406411
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казалось бы при чем тут Java.
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39406413
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfio,

Если вы совсем только на стадии изучения, то по-моему на много перспективнее научится использовать HTTP/2, а не TCP. На практике TCP используют только из-за ограничений HTTP.
С другой стороны понимание работы TCP иногда помогает в сложных ситуациях деплоймента.
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39406483
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

авторОдно и второе никак не связаны друг с другом. Возможно стоит перефразировать вопрос. Возможно вы хотели спросить про "соединение"? Маршрутизаторы работают так чтобы обеспечивать соединение прозрачно для клиента и сервера.
да, вы правы. Я именно соединение имел ввиду.

авторПеред тем как погрузится в принципы работы, я бы рекомендовал сначала с терминологией разобраться.
http://stackoverflow.com/questions/152457/what-is-the-difference-between-a-port-and-a-socket

с терминологией предметной области я более менее знаком, но без привязки к конкретным знаниям о конкретном классе Java. Т.е. нет четкого понимания какой конструктор какое соединение создает.

бегло прочел на хабре отличия HTTP от HTTP/2 и не очень понял, почему рекомендуете именно его?
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39406539
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfioда, вы правы. Я именно соединение имел ввиду.

Ну, вот есть одно устройство, есть маршрутизатор и есть другое. Маршрутизатор это особое устройство. Которое отправляет запросы одного устройства - другому.
https://en.wikipedia.org/wiki/Routing_protocol

wolfioс терминологией предметной области я более менее знаком
Да-да. Ни слова про TCP, ни слова о "протоколах". Зато пёрлов всяких:
"создания сокета на порте"
"отдать поток"
"просить трафик"
Если интересно разобраться, то читаем OSI и изучаем общераспространенные протоколы: NAT, TCP, HTTP, UDP и многие другие, зависит от того что именно вы хотите понять.

wolfioно без привязки к конкретным знаниям о конкретном классе Java.
ServerSocket открывает серверный TCP порт и слушает его. Socket открывает клиентский порт для соединения с серверным. В ваших вопросах про Java нет ничего.

wolfio Т.е. нет четкого понимания какой конструктор какое соединение создает.
Конструкторы создают объекты. ServerSocket и Socket это классы для работы по протоколу TCP.

wolfioбегло прочел на хабре отличия HTTP от HTTP/2 и не очень понял, почему рекомендуете именно его?
Потому что на прикладном уровне TCP в Java нужен в очень редких задачах. Чаще всего его используют для реализации двустороннего соединения, которое в HTTP реализуется с подвыподвертом. Но у TCP есть свои ограничения. Одно из них и правда связано с маршрутизацией. Но с появлением HTTP/2 какая либо польза от использования TCP отсутствует.
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39406555
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39406557
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кратко ассинхронность, задержки меньше

только вот я еще не понял у него есть понятие постоянного соединения. Вебсокеты вроде идут отдельной спецификацией
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412158
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczДа-да. Ни слова про TCP, ни слова о "протоколах".ну извините, теория была в институте =)
форум же для того, чтобы общаться по теме, разве нет?)

Вернулся к вопросу снова. Почитал разную теорию по вашим ключам, отличия http/2 от http. http/2 не нравится тем, что его еще нет в стандартных либах java. А до jdk9 еще дотерпеть надо.

Если позволите, у меня остался глупый вопрос про NAT:
Допустим, есть локальная сеть с выходом в интернет через роутер. На одной из машин сети запущен сервер, слушающий 9999 порт.
Правильно ли я понимаю, что чтобы подключиться к вышеуказанному серверу, нужно сделать проброс порта на роутере, и "снаружи" обращаться по адресу маршрутизатора?

и да, согласен, java в данном вопросе не при чем :)
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412166
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfioВернулся к вопросу снова. Почитал разную теорию по вашим ключам, отличия http/2 от http. http/2 не нравится тем, что его еще нет в стандартных либах java. А до jdk9 еще дотерпеть надо.

В "стандартных либах" aka API много чего нет. Это вообще не повод.

wolfioДопустим, есть локальная сеть с выходом в интернет через роутер. На одной из машин сети запущен сервер, слушающий 9999 порт.
Правильно ли я понимаю, что чтобы подключиться к вышеуказанному серверу, нужно сделать проброс порта на роутере, и "снаружи" обращаться по адресу маршрутизатора?
Да, это наиболее распространенный вариант.
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412192
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВ "стандартных либах" aka API много чего нет. Это вообще не повод.Вы правы. Меня скорее смущает то, что вариаций работы http/2 для java несколько (я гуглил разные примеры) и они не похожи по реализации. Это несколько осложняет гуглинг, при решении разного рода проблем.

У меня теперь концептуальный вопрос к вам, т.к. есть ощущение, что я курю не в том направлении.
я хочу создать простое клиент-серверное приложение, где сервер мог бы принимать какие-то команды на выполнение в консоли, по принципу telnet'а. При этом, не хотелось бы, чтобы трафик был зашифрованым.
Я гуглил про https(/2), и вижу сложность в том, чтобы получить сертификат. Как я понял из теории, я могу создать самозаверенный сертификат, но в этом случае wikiтакое использование HTTPS подвержено атаке man-in-the-middle.
есть альтернативы этому решению? или же, как перекрыть возможность man-in-the-middle ?

извините, что вопрос снова не совсем про java :)
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412194
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и забыл - если создать самозаверенный сертификат, то нужно ли его иметь клиентской стороне?
Вообще, можно ли создать шифрованое соединение без сертификатов?
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412200
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfioЭто несколько осложняет гуглинг, при решении разного рода проблем.
gRPC:
YouTube Video
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412258
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfioи забыл - если создать самозаверенный сертификат, то нужно ли его иметь клиентской стороне?
Вообще, можно ли создать шифрованое соединение без сертификатов?
сертификат - одни из методов аутентификации (куки\токен\заголовки\...).
Т.е. опять совсем в другую степь к сабжу.
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412261
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
wolfioПри этом, не хотелось бы, чтобы трафик был зашифрованым.
госпаде, я не в себе сегодня похоже.
конечно же я имел ввиду, что хотел бы чтобы он был шифрованным.

BlazkowiczМожно просто использовать стандартные решения SSL и HTTPS
не горю желанием открывать для себя мир криптографии, честно говоря. о каких стандартных решениях вы говорите?
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39412280
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfioо каких стандартных решениях
вы так быстро видео посмотрели и всё переварили? Или вы журналист?
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39414804
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
видео посмотрел, очень понравилось
настолько, что я кинулся сразу читать доку в оригинале, и зырить примеры
http://www.grpc.io/docs/quickstart/java.html

но ввиду своей неопытности, я даже не корректно запустить main из ..\src\test\java\io\grpc\examples\helloworld\HelloWorldClientTest.java


Бласко, а ты сам экспериментировал с этим решением? смог клиент-сервер поднять тестовый?
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39414808
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не смог*
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39414914
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
капец, как же злит когда 1 единственный релизер не может внятно изложить сэмплы и привести файлы в соответствии с их описанием.

вот именно об этом я и говорил, говоря про
авторЭто несколько осложняет гуглинг, при решении разного рода проблем
...
Рейтинг: 0 / 0
Сервер-клиент с пробросом сокета через прокси
    #39427904
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Пытаюсь установить пример grpc клиент-сервера по инструкции, изложенной тут: http://www.grpc.io/docs/quickstart/java.html

Разобрался со всеми командами консоли, но теперь проблема в следующем.
При выполнении команды
Код: plaintext
$ ./gradlew installDist

получаю вот такую проблему:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
C:\grpc-java-master\grpc-java-master\examples>gradlew installDist

Downloading  https://services.gradle.org/distributions/gradle-3.2-bin.zip 

Exception in thread "main" java.net.ConnectException: Connection timed out: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
        at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
        at sun.net.NetworkClient.doConnect(Unknown Source)
        at sun.net.www.http.HttpClient.openServer(Unknown Source)
        at sun.net.www.http.HttpClient.openServer(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
        at org.gradle.wrapper.Download.downloadInternal(Download.java:60)
        at org.gradle.wrapper.Download.download(Download.java:45)
        at org.gradle.wrapper.Install$1.call(Install.java:62)
        at org.gradle.wrapper.Install$1.call(Install.java:48)
        at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69)
        at org.gradle.wrapper.Install.createDist(Install.java:48)
        at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107)
        at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)

перегуглил кучу всяких переполненных стаков, удалось понять лишь то, что проблема в прокси (сижу на корпоративном прокси).
испробовал кучу вариантов - кидал файл со свойствами, содержащими прокси, и прописывал их как параметры
Код: plaintext
gradlew.bat -Dhttps.proxyHost=10.10.255.42 -Dhttps.proxyPort=8080 installDist
при таком варианте ругается на отсутствие сертификата (у меня есть подозрение, что корп. прокси запрещает создавать SSL соединения, т.к. с такой проблемой я ранее сталкивался).

Если же я меняю источник дистрибутива с http s на http, чтобы не парить мозги, и делаю
Код: plaintext
gradlew.bat -Dhttp.proxyHost=10.10.255.42 -Dhttp.proxyPort=8080 installDist


то загрузка какая-то начинается, но все ровно ошибка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
C:\!work_folder\grpc-java-master\grpc-java-master\examples>gradlew.bat -Dhttp.proxyHost=10.10.255.42 -Dhttp.proxyPort=8080 installDist
Downloading  http://services.gradle.org/distributions/gradle-3.2-bin.zip 
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
...................................................
Exception in thread "main" java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at java.io.BufferedInputStream.read1(Unknown Source)
        at java.io.BufferedInputStream.read(Unknown Source)
        at sun.net.www.MeteredStream.read(Unknown Source)
        at java.io.FilterInputStream.read(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
        at org.gradle.wrapper.Download.downloadInternal(Download.java:64)
        at org.gradle.wrapper.Download.download(Download.java:45)
        at org.gradle.wrapper.Install$1.call(Install.java:62)
        at org.gradle.wrapper.Install$1.call(Install.java:48)
        at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69)
        at org.gradle.wrapper.Install.createDist(Install.java:48)
        at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107)
        at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)

Почему происходит ресет я просто не понимаю. Может кто сталкивался?

тема получилась не совсем по Java, но по проблеме скачки через gradlew и тем-то особо нет..
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервер-клиент с пробросом сокета через прокси
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]