Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервер-клиент с пробросом сокета через прокси / 20 сообщений из 20, страница 1 из 1
17.02.2017, 11:22
    #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
17.02.2017, 11:30
    #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
17.02.2017, 11:30
    #39406411
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервер-клиент с пробросом сокета через прокси
Казалось бы при чем тут Java.
...
Рейтинг: 0 / 0
17.02.2017, 11:32
    #39406413
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервер-клиент с пробросом сокета через прокси
wolfio,

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

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

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

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

бегло прочел на хабре отличия HTTP от HTTP/2 и не очень понял, почему рекомендуете именно его?
...
Рейтинг: 0 / 0
17.02.2017, 13:21
    #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
17.02.2017, 13:32
    #39406555
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервер-клиент с пробросом сокета через прокси
...
Рейтинг: 0 / 0
17.02.2017, 13:35
    #39406557
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервер-клиент с пробросом сокета через прокси
Кратко ассинхронность, задержки меньше

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

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

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

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

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

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

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

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

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

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


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

вот именно об этом я и говорил, говоря про
авторЭто несколько осложняет гуглинг, при решении разного рода проблем
...
Рейтинг: 0 / 0
27.03.2017, 16:59
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервер-клиент с пробросом сокета через прокси / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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