Сообщение об ошибке не исчезает в 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 есть строка состояния.
Если вы видите это, вам нужно нажать на маленький крестик, чтобы остановить процесс, который вы запустили, но, возможно, забыли.