Сообщение об ошибке не исчезает в Netbeans, почему? "java.net.BindException: адрес уже используется: bind"

Это похоже на двойной вопрос о том, как убить процесс, уже запущенный на этом порту, но это другой вопрос. Когда я завершил процесс и перезапустил его, он по-прежнему выдает мне сообщение об ошибке, похоже, что у Netbeans есть проблема, и сообщение об ошибке застряло и продолжает появляться, даже когда порт не используется.

Я использовал инструмент по адресу: http://www.yougetsignal.com/tools/open-ports/ чтобы проверить порт: 6600

Вот что это говорит:

Мой код выглядит следующим образом:

import java.io.*;
import java.util.*;
import com.sun.net.httpserver.*;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import Utility.*;

public class Http_Server
{
  static int Port=6600,Thread_Count=50,Resume_Count=0;                                          // 8080
  InetSocketAddress addr;
  HttpServer server;
  static String App_Id="Resume_App";
  static Resume_Loader Resume_loader;
  static Get_Time Timer=new Get_Time();
  static Vector<String> Current_Keywords_Vector=new Vector();
  static boolean Debug_B=true;

  public Http_Server(int Port)
  {
    if (Port>-1) this.Port=Port;
    Srart_Server();
  }

  void Srart_Server()
  {
    try
    {
      Resume_loader=new Resume_Loader();

      addr=new InetSocketAddress(Port);
      server=HttpServer.create(addr,0);               // Line : 34
      server.createContext("/"+App_Id,new MyHandler(server));
      server.setExecutor(Executors.newCachedThreadPool());
      server.start();
      Out("Server is listening on port : "+Port);
    }
    catch (Exception e)
    {
      Resume_App.Save_To_Log(e.toString()+"\n"+Tool_Lib_Simple.Get_Stack_Trace(e));
      e.printStackTrace();
      Out(e.toString());
    }    
  }

  private static void out(String message) { System.out.print(message); }
  private static void Out(String message) { System.out.println(message); }

  public static void main(String[] args) { Http_Server Demo=new Http_Server(-1); }
}

Вчера все работало нормально, но сегодня утром я изменился:

InetSocketAddress addr;   to   static InetSocketAddress addr;
HttpServer server;        to   static HttpServer server;

Когда я запустил его, я получил следующее сообщение об ошибке:

Server is listening on port : 6600

    java.net.BindException: Address already in use: bind
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:437)
        at sun.nio.ch.Net.bind(Net.java:429)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at sun.net.httpserver.ServerImpl.<init>(ServerImpl.java:100)
        at sun.net.httpserver.HttpServerImpl.<init>(HttpServerImpl.java:50)
        at sun.net.httpserver.DefaultHttpServerProvider.createHttpServer(DefaultHttpServerProvider.java:35)
        at com.sun.net.httpserver.HttpServer.create(HttpServer.java:130)
        at Http_Server.Srart_Server(Http_Server.java:34)
        at Http_Server.<init>(Http_Server.java:24)
        at Http_Server.main(Http_Server.java:51)

Затем я понимаю, что если они статичны, они могут сохранять себя в памяти и занимать порт, поэтому я изменил их обратно на нестатические, как в приведенном выше коде. Но теперь, когда я его запускаю, сообщение об ошибке продолжает появляться, и в Netbeans появляется "уведомление", говорящее что-то вроде: "package-info.class находится в неправильном месте, удалите его или поместите в правильный подкаталог..."Не помню точную формулировку. Но когда я открываю URL, веб-страница работает нормально, как будто нет сообщения об ошибке, и когда я останавливаю сервер, страница не отображается так, как это должно быть.

Так что кажется, что Netbeans 8.0.2 работает неправильно, но я не знаю, как сделать так, чтобы сообщение об ошибке не появлялось, или как оно предлагало, как удалить "package-info.class" или поместить его в правильный sub dir, я даже не могу найти где это, как это исправить?

1 ответ

Что касается:

есть "уведомление", говорящее что-то вроде: "package-info.class находится не в том месте, удалите его или поместите в нужную подпапку...", не помню точную формулировку

Пожалуйста, сделайте это снова и скопируйте и вставьте или скопируйте точную формулировку в свой вопрос.

Я думаю, что было бы намного лучше явно вызвать shutdown() на вашем ExecutiveService и stop(1) на вашем HttpServer, а не надеяться, что сборка мусора сделает это. И это позволит вам контролировать печать некоторых сообщений, подтверждающих это.

например.

InetSocketAddress addr = new InetSocketAddress(6600);
ExecutorService es = Executors.newCachedThreadPool();
HttpServer server = HttpServer.create(addr, 0);;
server.createContext("/foo", new HttpHandler() {

    @Override
    public void handle(HttpExchange he) throws IOException {
        String response = "My Response";
        he.sendResponseHeaders(200, response.length());
        OutputStream os = he.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }
});
server.setExecutor(es);

server.start();
System.out.println("Press enter to stop server.");

// block waiting for user to press enter.
System.in.read();
System.out.println("Shutting down");
server.stop(1);
es.shutdownNow();
System.out.println("should be shutdown now.");

Также в нижней части NetBeans есть строка состояния.

скриншот строки состояния

Если вы видите это, вам нужно нажать на маленький крестик, чтобы остановить процесс, который вы запустили, но, возможно, забыли.

Другие вопросы по тегам