2012-12-17 4 views
5

Ich habe das Proximo-Add-on auf Heroku installiert und wenn ich den Befehl meinem vorhandenen Befehl voranstelle, bekomme ich eine BindException von Java. So sieht mein vorangestelltes Kommando aus: web: bin/proximo sh target/bin/webapp und sobald ich den Proximo Teil entferne (bin/proximo), startet die Anwendung ohne Fehler.Wie man java.net.BindException mit Proximo auf Heroku repariert?

Dies ist der vollständige Stacktrace. Was vermisse ich?

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) 

Antwort

0

Es ist etwas, an einen anderen Prozess Port 9999. Unter Windows mit verwandten, führen Sie den Befehl:

netstat -a -n | find "LIST" 

Und es sollte dort Liste etwas ob der Port des hogging. Natürlich müssen Sie dann diese Programme im Task-Manager manuell beenden. Wenn dies immer noch nicht funktioniert, ersetzen Sie die Zeile:

serverSocket = new ServerSocket(9999); 

mit:

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

Verwenden 127.0.0.1 mit Ihrer tatsächlichen IP-Adresse.

+0

Obwohl ich die gleiche Ausnahme wie Visher in diesem Beitrag http://stackoverflow.com/questions/8965155/cannot-assign-requested-address-jvm-bind es ist nicht das gleiche Problem. Ich benutze eine Java-App auf Heroku und benutze das Add-on Proximo, um den gesamten ausgehenden TCP-Verkehr zu übertragen. Beim Start zeigen die Protokolle Folgendes an (Proxy-Verkehr für 0.0.0.0/0 über Proximo-Host XX.XX.XX.XXX:1080 gebunden). Also scheint das Proximo Add-On korrekt installiert und konfiguriert zu sein. Die Anwendung wird jedoch aufgrund der BindException angehalten. Ich starte meinen eigenen ServerSocket nicht - er wird vom Proximo Add-In gehandhabt. –

+0

Ich habe gerade einen Netstat | grep "1080" (1080 ist der Port, an den Proximo zu binden versucht), aber nichts wird angezeigt (d. h. der Port ist nicht belegt). Wenn ich versuche, die IP allein zu pingen, bekomme ich "Request Timeout" und wenn ich versuche, die IP an Port 1080 zu pingen, bekomme ich "konnte Host nicht finden". Ich vermute, dass die IP (und der Port), an die Proximo zu binden versucht, irgendwie vom Server erkannt werden muss (Heroku läuft von Amazon-Servern). Gibt es einen Weg, dies zu erreichen? Jede Hilfe wird sehr geschätzt. –

1

Denken Sie daran, dass Sie nur den Port verwenden können, den Heroku in der $ PORT-Variablen bereitstellt.

Deshalb:

web: bin/proximo [your existing command] 

muss dies umfassen z:

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

oder was auch immer Sie den Port Ihre Web-Prozess läuft auf diktieren müssen.

0

Der Proximo-Wrapper funktioniert nicht mit Java. Anstatt den Wrapper zu verwenden, müssen Sie der App-Initialisierung einen benutzerdefinierten Code hinzufügen.

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)); 

Und

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; 
    } 
} 

Die Lösung ist vollständig in this article beschrieben.

Verwandte Themen