http.server Address already in use:

bnr

Mitglied
Hallo, ich verwende Jax-WS um Webservices zu realisieren. Unter MAC funktioniert die Applikation ohne Probleme (Jar). Unter Windows und Linux hingegen nicht. Hier erhalte ich folgende Meldung.

Code:
.....
Exception in thread "Thread-2" com.sun.xml.internal.ws.server.ServerRtException: Server Runtime Error: java.net.BindException: Address already in use: bind
        at com.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(Unknown Source)
        at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(Unknown Source)
        at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(Unknown Source)
        at com.soft2tec.stanandoli.oli.init.WebService.startWebService(WebService.java:150)
        at com.soft2tec.stanandoli.oli.init.WebService.run(WebService.java:163)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.net.BindException: Address already in use: bind
        at sun.nio.ch.Net.bind(Native Method)
        at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
        at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
        at sun.net.httpserver.ServerImpl.<init>(Unknown Source)
        at sun.net.httpserver.HttpServerImpl.<init>(Unknown Source)
        at sun.net.httpserver.DefaultHttpServerProvider.createHttpServer(Unknown Source)
        at com.sun.net.httpserver.HttpServer.create(Unknown Source)
        ... 6 more

Die Meldung kann aber nicht sein, da der angegebene Port nicht verwendet wird. Es ist auch egal, welchen Port ich angebe. Die Meldung bleibt immer gleich.

Hier ein paar Codeschnipsel.
Code:
....
 
    private static Map<String, Endpoint> endpoints = new HashMap<String, Endpoint>();

    private Map<String, Object> serviceImp = new HashMap<String, Object>();
....
    public WebService(String host, int port, int backlog) {
        // Create new Endpoints
        this.host = host;
        this.port = port;
        this.backlog = backlog;
        serviceImp.put("ressourcename", new RessourcenNameImpl());
        ...
        serviceImp.put("applicationversion", new ApplicationVersionImpl());

        for (String ressource : serviceImp.keySet()) {
            Endpoint endpoint = Endpoint.create(serviceImp.get(ressource));
            endpoints.put(ressource, endpoint);
        }
.....

public void startWebService() throws Exception {
        logger.info("Starting Webservice on  " + host + " port " + port);
        server = HttpServer.create(new InetSocketAddress(port), backlog);
        // httpThreadPool = Executors.newFixedThreadPool(0);
        // server.setExecutor(httpThreadPool);
        logger.info("Publish endpoints");

        // Publish now all endpoints
        for (String ressource : serviceImp.keySet()) {
            Endpoint endpoint = endpoints.get(ressource);
            endpoint.publish("http://" + host + ":" + port + "/abc/"
                    + ressource);
        }

        server.start();
    }

Die Zeile 150 sieht wie folgt aus
endpoint.publish("http://" + host + ":" + port + "/abc/"

Ich stehe auf dem Schlauch und finde im Internet keine andere Erklärung. Hat wer eine Idee!
 
Unter Linux könnte es bei Ports unt 1023 zu dieser Meldung kommen da du dafür ROOT-Rechte brauchst.
Unter Windows könnte dir eine FireWall dazwischen funken.

Java hat leider keine gesonderten Meldungen für solche Probleme. Wenn ein Port nicht belegt werden konnte , aus welchen Gründen auch immer , gibt es leider nur diese eine Exception.

Prüfe also unter Linux und Windows mal eventuell vorhandene FireWall-Einstellungen und versuche es mit einem Port oberhalb von 1024.
 
Hi,

unter Linux könnte es daran liegen, dass ein nicht priviligierter Benutzer keine Ports unter 1024 (?) binden darf. Hier musst du das Programm (bzw. den bind) als root ausführen.

Welchen Port willst du denn benututzen?

Ob dieser wirklich frei ist, kannst du normalerweise über ein "telnet <ip> <port>" schnell rausfinden. Falls hier die Gegenseite antwortet, ist der Port in Benutzung.

Was ich mir noch vorstellen könne: Bei dem Bind gibt du ihm einen Hostnamen und den Port mit. Kann der Hostname via DNS auch aufgelöst werden? (Unter Windows in der cmd: nslookup <hostname>)

@Spike: Die Firewall verhindert soweit ich es weiß nicht, dass ein Port belegt wird, sondern nur, dass dieser von aussen erreichbar ist. Das binden sollte also nicht an einer Firewall scheitern.

Gruß
BK
 
Allgemein wollen wir 8080 verwenden. Wir haben aber auch schon 8090, 8091, 1212 usw Probiert. Alle gehen unter Windows XP, Windows 7 und Linux nicht. Es ist keine Firewall installiert! Ich habe jetzt unter Windows XP mal Java 7 installiert. Problem besteht immer noch!
 
@Bratkartoffel
Oh doch ... z.B. die Avira FireWall ...
Wenn ich dort Java den "Zugang" verweigere bekomme ich auch *seltsamer weise* genau diesen Error : ADDRESS ALREADY IN USE ...
Von daher war meine Frage schon begründet da ich ja selbst damit Erfahrungen habe =D.

@bnr
Sicher das es keine FireWall gibt ? Auch schon mal in der Systemsteuerung nach der WindowsFireWall gesucht ? Ist gerne ein beliebtes Problem.
 
Die Windows Firewall ist bei mir immer aus, da ich das Ding nicht mag. Es ist auch kein AV oder andere Firewall installiert. Dieses Problem habe ich mit Windows XP (VM-Ware), Windows 7 bei meinem Kollegen, die Linux-Kiste von meinem Teamleiter und der Linux Server wo unser Jenkins läuft. Daher kann es nicht am Rechner liegen! Im Code sehe ich aber auch kein Fehler und unter Mac geht ja alles!
 
Zuletzt bearbeitet:
Ich kenne mich mit diesem Framework nicht aus ... daher weis ich nicht ob es daran liegt das du eine URL übergibst *was mir eigentlich schon beim ersten Mal lesen aufgefallen ist*.
Vielleicht solltest du dich mal in einem Forum zu diesem Framework melden ... die dürften da mehr Ahnung haben.
 
Ha, Problem gefunden. Jax-Ws braucht kein servlet, EJB container usw. Einfach Endpoints publishen und gut ist. Somit benötigt man auch kein HttpServer. Um aber mehr Kontrolle zu bekommen, kann man einen eigenen HttpServer verwenden, was ich ja wollte. Aber, wenn man einen eigenen HttpServer verwenden möchte, dann muss der HttpServer erstellt und gestartet werden bevor man die Endpoints erstellt und publiziert. Angewendet auf mein Beispiel müsste dann dies so aussehen

Code:
....
 
    private static Map<String, Endpoint> endpoints = new HashMap<String, Endpoint>();
 
    private Map<String, Object> serviceImp = new HashMap<String, Object>();
....
    public WebService(String host, int port, int backlog) {
        // Create new Endpoints
        this.host = host;
        this.port = port;
 
        logger.info("Starting Webservice on  " + host + " port " + port);
        server = HttpServer.create(new InetSocketAddress(port), backlog);
        server.start();
        
        serviceImp.put("ressourcename", new RessourcenNameImpl());
        ...
        serviceImp.put("applicationversion", new ApplicationVersionImpl());
 
        for (String ressource : serviceImp.keySet()) {
            Endpoint endpoint = Endpoint.create(serviceImp.get(ressource));
            endpoints.put(ressource, endpoint);
        }
.....
 
public void publishEndPoints() throws Exception {
        logger.info("Publish endpoints");
 
        // Publish now all endpoints
        for (String ressource : serviceImp.keySet()) {
            Endpoint endpoint = endpoints.get(ressource);
            endpoint.publish("http://" + host + ":" + port + "/abc/"
                    + ressource);
        }
    }
 
Zurück