2012-12-17 14 views
5

Ho installato il componente aggiuntivo Proximo su Heroku e quando prepone il comando al mio comando esistente, ottengo BindException da Java. Ecco come appare il mio comando anteposto: web: bin/proximo sh target/bin/webapp e non appena rimuovo la parte di Proximo (bin/proximo), l'applicazione si avvia senza errori.Come risolvere java.net.BindException con Proximo su Heroku?

Questo è lo stacktrace completo. Cosa mi manca?

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) 

risposta

0

E 'qualcosa legato a un altro processo che utilizza la porta 9999. Su Windows, eseguire il comando:

netstat -a -n | find "LIST" 

E dovrebbe elencare nulla che sta monopolizzando la porta. Ovviamente dovrai andare e uccidere manualmente quei programmi in Task Manager. Se questo ancora non funziona, sostituire la riga:

serverSocket = new ServerSocket(9999); 

Con:

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

Uso 127.0.0.1 con il vostro indirizzo IP reale.

+0

Anche se ottengo la stessa eccezione di Visher in questo post http://stackoverflow.com/questions/8965155/cannot-assign-requested-address-jvm-bind non è lo stesso problema. Sto eseguendo un'applicazione Java su Heroku e utilizzando il componente aggiuntivo Proximo per eseguire il proxy di tutto il traffico TCP in uscita. All'avvio, i registri mostrano quanto segue (traffico Proxying vincolato per 0.0.0.0/0 tramite host Proximo XX.XX.XX.XXX:1080). Quindi, il componente aggiuntivo Proximo sembra essere installato e configurato correttamente. Tuttavia, l'applicazione si arresta a causa di BindException. Non avvio il mio ServerSocket - è gestito dal componente aggiuntivo Proximo. –

+0

Ho appena fatto un netstat | grep "1080" (1080 è la porta su cui Proximo sta tentando di collegarsi) ma non appare nulla (ad esempio, la porta non è utilizzata). Quando provo a eseguire il ping dell'IP da solo, ottengo "Richiesta scaduta" e quando provo a eseguire il ping dell'IP sulla porta 1080, ottengo "Impossibile trovare l'host". Ho il sospetto che l'IP (e la porta) Proximo sta cercando di legarsi a deve in qualche modo essere riconosciuto dal server (Heroku funziona su server Amazon). C'è un modo per ottenere questo? Qualsiasi aiuto è molto apprezzato. –

1

Ricordare che è possibile utilizzare solo la porta che Heroku fornisce nella var $ PORT.

Pertanto:

web: bin/proximo [your existing command] 

ha la necessità di includere questo, per esempio:

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

o qualsiasi altra cosa è necessario dettare il porto il processo di web gira su.

0

Il wrapper proximo non funziona con Java. Invece di utilizzare il wrapper, dovrai aggiungere un codice personalizzato all'inizializzazione della tua app.

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

E

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

La soluzione è descritto completamente in this article.