2012-12-17 1 views
5

Heroku에 Proximo 추가 기능을 설치했으며 기존 명령에 명령을 추가 할 때 Java에서 BindException을받습니다. 이것은 내 prepended 명령이 보이는 방법입니다 : web: bin/proximo sh target/bin/webapp 그리고 Proximo 파트 (bin/proximo)를 제거하면 오류없이 응용 프로그램이 시작됩니다.Heroku에서 Proximo로 java.net.BindException을 고치는 방법?

전체 스택 추적입니다. 내가 뭘 놓치고 있니?

Exception in thread "main" java.net.BindException: Cannot assign requested address 
at sun.nio.ch.Net.bind0(Native Method) 
at sun.nio.ch.Net.bind(Net.java:344) 
at sun.nio.ch.Net.bind(Net.java:336) 
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:199) 
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:162) 
at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:297) 
at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:240) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58) 
at org.eclipse.jetty.server.Server.doStart(Server.java:270) 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58) 

답변

0

그것은 Windows에서 포트 9999를 사용하여 다른 프로세스와 관련된 무언가 명령을 실행합니다

netstat -a -n | find "LIST" 

을 그리고 거기 포트를 소모하는 것 아무것도 나열해야합니다. 물론 작업 관리자에서 해당 프로그램을 수동으로 종료해야합니다. 실제 IP 주소로

InetAddress locIP = InetAddress.getByName("192.168.1.20"); 
serverSocket = new ServerSocket(9999, 0, locIP); 

사용 127.0.0.1 :

serverSocket = new ServerSocket(9999); 

으로이 여전히 작동하지 않으면, 라인을 교체합니다.

+0

이 게시글에서 Visher와 동일한 예외가 있지만 http://stackoverflow.com/questions/8965155/cannot-assign-requested-address-jvm-bind는 동일한 문제가 아닙니다. 나는 Heroku에서 Java 응용 프로그램을 실행하고 추가 기능 인 Proximo를 사용하여 모든 아웃 바운드 TCP 트래픽을 프록시 처리합니다. 시작할 때 로그에는 다음과 같은 내용이 표시됩니다 (Proximo 호스트 XX.XX.XX.XXX:1080을 통해 0.0.0.0/0에 바인딩 된 프록 싱 트래픽). 따라서 Proximo 애드온이 올바르게 설치 및 구성되어있는 것 같습니다. 그러나 BindException으로 인해 응용 프로그램이 중단됩니다. 나는 내 자신의 ServerSocket을 시작하지 않는다 - 그것은 Proximo add-in에 의해 처리된다. –

+0

방금 ​​netstat을했습니다. grep "1080"(1080은 Proximo가 바인딩하려는 포트 임) 아무 것도 표시되지 않습니다 (즉 포트가 사용되지 않음). IP 혼자서 ping을 시도 할 때, "Request timed out"을 얻었고 포트 1080에서 IP를 ping하려고 할 때 "호스트를 찾을 수 없습니다"라는 메시지가 나타납니다. Proximo가 바인딩하려고하는 IP (및 포트)가 어떻게 든 서버 (Heroku는 Amazon 서버에서 실행 됨)에 의해 인식되어야한다고 생각합니다. 이것을 달성 할 수있는 방법이 있습니까? 어떤 도움이라도 대단히 감사합니다. –

1

Heroku가 제공하는 포트는 $ PORT var에서만 사용할 수 있습니다. 따라서

:

web: bin/proximo [your existing command] 

이 포함되어야, 예컨대 :

web: bin/proximo [your existing command] -p $PORT 

또는 웹 프로세스가 실행되는 포트를 지시 할 필요가 뭐든간에.

0

Java에서는 proximo wrapper가 작동하지 않습니다. 래퍼를 사용하는 대신 앱의 초기화에 맞춤 코드를 추가해야합니다.

URL proximo = new URL(System.getenv("PROXIMO_URL")); 
String userInfo = proximo.getUserInfo(); 
String user = userInfo.substring(0, userInfo.indexOf(':')); 
String password = userInfo.substring(userInfo.indexOf(':') + 1); 

System.setProperty("socksProxyHost", proximo.getHost()); 
Authenticator.setDefault(new ProxyAuthenticator(user, password)); 

그리고

private class ProxyAuthenticator extends Authenticator { 
    private final PasswordAuthentication passwordAuthentication; 

    private ProxyAuthenticator(String user, String password) { 
    passwordAuthentication = new PasswordAuthentication(user, password.toCharArray()); 
    } 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
    return passwordAuthentication; 
    } 
} 

이 솔루션은 this article 완전히 설명되어 있습니다.