Доступ к собственному частному IP-адресу с публичного IP-адреса

Я разрабатываю серверно-клиентское приложение. Серверный — это, по сути, встроенный сервер гризли, предоставляющий службы REST, а клиент должен быть приложением для Android. Для предоставления услуг REST я использую ресурс spring.My:

@Component
@Path("/info")
public class InfoResource {

private static Logger logger = Logger.getLogger(InfoResource.class);

@SuppressWarnings("unchecked")
@Path("/")
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response info(){

    Response response = null;

    JSONObject jsonObject = new JSONObject();

    jsonObject.put("Server Name", "Woghetto Server");
    jsonObject.put("Date", new Date());

    response = Response.ok(jsonObject).build();

    logger.debug(jsonObject.toJSONString());

    response = Response.ok(jsonObject).build();

    return response;
}

Сервер не предназначен для развертывания во внешнем домене, поэтому он должен быть доступен с общедоступного IP-адреса. Я использую jTCPfwd-lite-0.5 для туннелирования моего частного IP-адреса на мой общедоступный IP-адрес @ порт 80. В целях тестирования мне нужно получить доступ к открытым ресурсам с того же ноутбука, на котором развернут сервер. По сути, я хотел бы получить доступ к моему серверу, развернутому на локальном хосте: 8080, с клиента jersey 2, используя мой общедоступный IP-адрес в качестве цели. Я пробовал несколько способов, но в основном я строю клиент следующим образом:

Response response = client.target("http://" + targetAddress + ":80/info")  
.request().get();

и что я получаю, это трассировка стека

javax.ws.rs.ProcessingException: java.net.UnknownHostException: 109.134.124.94%0A 
at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:244)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:254)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:671)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:668)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:668)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:402)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:302)
at be.pcab.wonghetto.wonghettoserver.resources.InfoResourceTest.testTunnelingInfoResource(InfoResourceTest.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.net.UnknownHostException: 109.134.124.94%0A
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
at sun.net.www.http.HttpClient.New(HttpClient.java:308)
at sun.net.www.http.HttpClient.New(HttpClient.java:326)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1168)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1104)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:932)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:335)
at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:242)
... 36 more

или вот так

Response response = client.target(basicURI)
            .request().get();

получающий

javax.ws.rs.ProcessingException: URI is not absolute
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:263)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:671)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:668)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:668)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:402)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:302)
at be.pcab.wonghetto.wonghettoserver.resources.InfoResourceTest.testTunnelingInfoResource(InfoResourceTest.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.IllegalArgumentException: URI is not absolute
at java.net.URI.toURL(URI.java:1088)
at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:272)
at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:242)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:254)
... 35 more

куда

basicURI = UriBuilder.fromUri(targetAddress)
            .port(80) .path("/info").build();

а targetAddress — мой общедоступный IP-адрес, например, 123.456.789.11.

Обычно сервер должен быть доступен из-за пределов моего маршрутизатора, поэтому я думаю, что он должен работать, но, как я уже говорил, мне нужно протестировать приложение, и я хотел бы сделать это из тестового примера JUnit. Я полагаю, что я мог бы проверить это также из приложения для Android, но мне это не кажется ни хорошей практикой, ни быстрой.

Любая помощь приветствуется!


person volbollo    schedule 16.07.2015    source источник
comment
Примечание 109.134.124.94%0A — %0A не является допустимым компонентом IP-адреса. например у вас есть символ \n в IP-адресе.   -  person Marc B    schedule 16.07.2015
comment
Я это заметил, но не понял, что это из-за \n   -  person volbollo    schedule 16.07.2015
comment
Я внес изменение... В настоящее время я получаю ответ 404 от сервера, что лучше, но не решает проблему... в любом случае спасибо!   -  person volbollo    schedule 16.07.2015
comment
иногда порт 8080 используется другими службами, попробуйте другой порт, например 8081, или что-то еще   -  person maytham-ɯɐɥʇʎɐɯ    schedule 16.07.2015
comment
Пробую и с 8082... правда чаще использую 8082 вместо 8080   -  person volbollo    schedule 16.07.2015
comment
можете поделиться тесткейсом (на github)?   -  person alexey    schedule 17.07.2015
comment
@alexey вот он, проект Wonghetto-project, а правая ветка - PerformingTest . Правильный модуль называется wonghetto-server, а InfoResourceTest находится в папке src/test--›be.pcab.wonghetto.wonghettoserver.resources.   -  person volbollo    schedule 17.07.2015


Ответы (1)


Я обнаружил несколько проблем с вашим приложением:

  1. InfoResource не зарегистрирован в Configuration, поэтому /info недоступен.
  2. В InfoResourceTest вы не регистрируете сервлеты:

    WebContainer.registerServlet(webappContext);
    
  3. InfoResource возвращает объект JSON, поэтому, вероятно, вы хотели объявить его как:

    @Produces(MediaType.APPLICATION_JSON)
    
  4. После применения всех вышеперечисленных изменений приложение доступно непосредственно на локальном хосте: 8082, но по-прежнему не через сервер пересылки, поэтому с этой частью также должно быть что-то не так.

person alexey    schedule 17.07.2015
comment
Во-первых, спасибо за ответ... На самом деле при выполнении тестов я забыл несколько шагов. Итак, я зарегистрировал InfoResource (1), я зарегистрировал сервлет (2), (3) на самом деле не было проблемой, это было больше связано с тем, что я нажал. Идея состоит в том, чтобы использовать json в качестве формата данных для обмена, но на данный момент я локально понизил версию. В моем рабочем пространстве я пытаюсь получить строку, и ресурс создает обычный текст. И я согласен с вами, когда все правильно, сервер доступен по адресу localhost: 8082, но по-прежнему недоступен через общедоступный IP-адрес. - person volbollo; 18.07.2015
comment
Но AFAIU вы используете какой-то сервер пересылки на общедоступном адресе, который не пересылает запрос на ваш сервер джерси. Так что проблем с сервером в Джерси я пока не вижу. - person alexey; 18.07.2015
comment
Я знаю, что проблема не связана с сервером джерси (ошибки были более небрежной ошибкой, чем при работе с API джерси-гризли) ... Я разместил информационный ресурс для предоставления фона (и это была хорошая идея, потому что вы указали на существующие ошибки ), но настоящая проблема именно в сервере пересылки... извините, если неясно - person volbollo; 18.07.2015
comment
Кажется, он работает довольно хорошо из командной строки, но мне интересно, могу ли я действительно отлаживать свое приложение, поскольку мне нравится делать это с помощью junit вместо того, чтобы делать запросы от клиента Android. В любом случае, для всех, кто заинтересован, приложение для пересылки jTCPfwd-lite доступно на sourceforge. - person volbollo; 18.07.2015