如何检查服务器是否在Java HttpServer中运行方法;获取java.net.UnknownHostException
我正在安排服务器上的任务,但我不知道如何知道当前是否有服务器正在执行任务。我正在这样的服务器上循环:如何检查服务器是否在Java HttpServer中运行方法;获取java.net.UnknownHostException,java,networking,Java,Networking,我正在安排服务器上的任务,但我不知道如何知道当前是否有服务器正在执行任务。我正在这样的服务器上循环: for(int i = 0; i < tasksList.size(); i++){ for(URL url : serverURLsList){ if(InetAddress.getByName(url.toString()).isReachable(0)){ //this gives me exception HttpURLConnecti
for(int i = 0; i < tasksList.size(); i++){
for(URL url : serverURLsList){
if(InetAddress.getByName(url.toString()).isReachable(0)){ //this gives me exception
HttpURLConnection availableServer = (HttpURLConnection) url.openConnection();
availableServer.setDoOutput(true);
ObjectOutputStream oos = new ObjectOutputStream(availableServer.getOutputStream());
oos.writeObject(tasksList.get(i));
oos.close();
tasksList.remove(i);
break;
}
}
}
for(int i=0;i
这是我的任务处理服务器:
public class Serv{
public static void main(String[] args) throws IOException {
int port = 8080;
String host = "192.168.1.116";
System.out.println("Server 1 is up. Host: " + host + " port: " + port);
HttpServer s= HttpServer.create(new InetSocketAddress(host, port), 0);
s.createContext("/", new RootHandler());
s.setExecutor(null);
s.start();
}
}
class RootHandler implements HttpHandler{
private static int clientCounter = 1;
@Override
public void handle(HttpExchange exchange) throws IOException {
System.out.println("\nRoot handler; \n\tclient no. " + clientCounter++);
Task t;
ObjectInputStream ois = new ObjectInputStream(exchange.getRequestBody());
try {
System.out.println("Recieved object:");
t = (Task) ois.readObject();
ois.close();
System.out.println("Array not sorted:");
int[] arr = (int[]) t.getData();
for (int anArr : arr) {
System.out.print(anArr + " ");
}
TaskSolver.solve(t); // need to check if this is runned on the server or server is doing nothing
System.out.println("\nArray sorted!");
for (int anArr : (int[])t.getData()) {
System.out.print(anArr + " ");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String response = "<h1>Server up!</h1>";
exchange.sendResponseHeaders(200, response.getBytes().length);
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
公共类服务{
公共静态void main(字符串[]args)引发IOException{
int端口=8080;
字符串host=“192.168.1.116”;
System.out.println(“服务器1已启动。主机:“+Host+”端口:“+port”);
HttpServer s=HttpServer.create(新的InetSocketAddress(主机、端口),0);
s、 createContext(“/”,newrootHandler());
s、 setExecutor(null);
s、 start();
}
}
类RootHandler实现HttpHandler{
私有静态int clientCounter=1;
@凌驾
公共无效句柄(HttpExchange)引发IOException异常{
System.out.println(“\n根处理程序;\n\t客户端号“+clientCounter++”);
任务t;
ObjectInputStream ois=新的ObjectInputStream(exchange.getRequestBody());
试一试{
System.out.println(“接收对象:”);
t=(任务)ois.readObject();
ois.close();
System.out.println(“数组未排序:”);
int[]arr=(int[])t.getData();
用于(国际机场:arr){
系统输出打印(anArr+“”);
}
TaskSolver.solve(t);//需要检查这是在服务器上运行的还是服务器什么都不做
System.out.println(“\nArray sorted!”);
for(int anArr:(int[])t.getData(){
系统输出打印(anArr+“”);
}
}catch(classnotfounde异常){
e、 printStackTrace();
}
String response=“服务器启动!”;
sendResponseHeaders(200,response.getBytes().length);
OutputStream os=exchange.getResponseBy();
write(response.getBytes());
os.close();
}
}
我真正想要实现的是,如果列表中的任何服务器当前正在解决该任务,那么就可以获得相关信息(上面代码段中的注释显示了该位置)。不知道为什么会出现标题中提到的异常,因为我可以通过web浏览器访问服务器。我认为方法isReachable()
不适合这个目的(因为它应该告诉我主机是否已关闭,而我想知道服务器上的正确方法当前是否正在运行)。有人知道这样做的好办法吗
@编辑
根据评论,我需要说的是,我的每个服务器(我会有很多)应该只执行一项任务,这就是我模拟的目的
InetAddress.getByName(url.toString()).isReachable(0)){ //this gives me exception
当然有。
InetAddress.getByName()
的参数不是URL。检查Javadoc。它是一个主机名。您真的想要单线程服务器吗?您的服务器一次只能处理一个任务吗?另外,您在实际处理请求之前发送响应。。。这似乎不对。为了让服务器用“忙”消息答复新请求,您必须有更多的请求处理线程,其中一个线程将忙于处理请求,另一个线程将用“忙”消息答复其他传入请求。是的,我需要单线程服务器。这是一种替代。取而代之的是一台有线程的服务器,我有许多服务器(它被称为雾计算)。你能提供任何类型的实现来帮助我理解你的想法吗?是的,我知道响应是错误的,我忘了更改它(我正在测试是否可以从web浏览器访问服务器)关于如何编写多线程请求处理程序的文档在web上随处可见,请进行研究。它相对简单,但不是琐碎的,我们不会为你们写。好吧,总结一下。我的处理程序中需要有两个线程:一个用于繁忙状态,另一个用于非繁忙状态。但是,我仍然不知道如何检查循环中的状态:(每次收到请求时,您都会启动一个处理程序线程。处理程序线程检查另一个任务处理程序线程是否已经在运行,并回答“忙”如果它找到了一个,否则它将处理任务。正确地执行此操作并确保不进入竞争条件需要多线程编程方面的一些专业知识。对此进行研究(关于线程的Java教程可能会有所帮助),编写代码,测试它,当你遇到问题时,在这里问一个新问题,显示你的代码。这与OP的问题无关。@JimGarrison,请原谅?OP已经发布了一段代码,他清楚地声明抛出了一个未知后异常
,就在标题中,也在代码本身中。请注意目前,这不是问题的实质。isReachable()
方法只是试图处理实际问题。标题分为两部分。@soummy12在这种情况下,由OP来澄清他的标题和问题。我已经回答了标题中表达的问题。不清楚还可能期望什么。“如何检查服务器是否正在运行”至少部分由OP来回答isReachabe()
,如果OP要继续使用,他肯定必须采用此答案中的解决方案。@EJP Imo,您仍然只回答问题的一半。已指定此方法例外