2015-10-24 3 views
0

Добрый вечер, я получил этот сервер здесьКоманда Отправить на HTTP сервер

import java.io.IOException; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; 
import java.util.concurrent.atomic.AtomicInteger; 
import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

public class Test { 

public static void main(String[] args) throws Exception { 
    HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); 
    server.createContext("/test", new MyHandler()); 
    server.setExecutor(null); // creates a default executor 
    server.start(); 
} 

static class MyHandler implements HttpHandler { 
    AtomicInteger atomicInteger = new AtomicInteger(0); 
    int theValue = atomicInteger.get(); 
    @Override 
    public void handle(HttpExchange t) throws IOException { 
    String response = String.format("Besuche: %d%n", atomicInteger.addAndGet(1)); 
     t.sendResponseHeaders(200, response.length()); 
     OutputStream os = t.getResponseBody(); 
     os.write(response.getBytes()); 
     os.close(); 
    } 
} 


} 

Сво считая каждый визит я сделать на сайте http://localhost:8000/test Теперь у меня есть клиент, который показывает мне содержание сервера в моей консоли ,

import java.net.*; 
import java.io.*; 

public class URLConnectionReader { 
public static void main(String[] args) throws Exception { 
    URL test = new URL("http://localhost:8000/test"); 
    URLConnection connect = test.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(connect.getInputStream())); 
    String inputLine; 

    while ((inputLine = in.readLine()) != null) 
     System.out.println(inputLine); 
    in.close(); 
} 
} 

Я хочу, чтобы клиент отправил сервер команде, которая сбрасывает счетчик на сервере. Я мог бы просто найти это here, но я не знаю, как реализовать это в моем случае. Надеюсь, кто-то может объяснить мне, что я могу сделать сейчас.

ответ

1

В коде, который вы указали, метод MyHandlerhandle обрабатывает запросы для пути /test. Итак, первое, что вы должны решить, это если вы хотите получить команду сбрасывать команду на том же пути или на другом?

Если вы хотите обрабатывать на том же пути, то вам необходимо изменить MyHandler различать просьбу об увеличении числа, хранящегося в atomicInteger - давайте назовем эту GET команду и запрос для сброса счетчика - назовём это POST команда. Посмотрите, что мы сделали? Мы использовали два HTTP request methods для разграничения между двумя командами. Теперь вы хотите изменить MyHandler, чтобы реализовать это. В методе handle вы получаете HttpExchange объект в параметре t, который имеет метод getRequestMethod. Таким образом, код будет выглядеть примерно так:

@Override 
public void handle(final HttpExchange t) throws IOException { 
    final String response; 

    final String requestMethod = t.getRequestMethod(); 
    if ("GET".equals(requestMethod)) { 
     response = String.format("Besuche: %d%n", atomicInteger.addAndGet(1)); 
    } 
    else if ("POST".equals(requestMethod)) { 
     atomicInteger.set(0); 

     response = "Reset to 0"; 
    } 
    else { 
     throw new IOException("Unsupported method"); 
    } 

    t.sendResponseHeaders(200, response.length()); 
    final OutputStream os = t.getResponseBody(); 
    os.write(response.getBytes()); 
    os.close(); 
} 

Если вы хотите обработать по другому пути, скажем, на /reset, вам нужно зарегистрировать еще один обработчик для этого пути я в main метода добавить:

server.createContext("/reset", new ResetHandler()); 

Теперь в этом обработчике и в существующем обработчике вам нужно разделить одно и то же состояние программы - то же самое описание AtomicInteger. Это лучше всего сделать, создав AtomicInteger в методе main и передав его двум обработчикам с помощью конструктора обработчика. Это выглядело бы что-то вроде:

static class MyHandler implements HttpHandler { 

    private final AtomicInteger counter; 

    public MyHandler(final AtomicInteger counter) { 
     this.counter = counter; 
    } 

    @Override 
    public void handle(final HttpExchange t) throws IOException { 
     // ... same code, only reference the counter 
    } 
} 

static class ResetHandler implements HttpHandler { 
    private final AtomicInteger counter; 

    public ResetHandler(final AtomicInteger counter) { 
     this.counter = counter; 
    } 

    @Override 
    public void handle(final HttpExchange exchange) throws IOException { 
     counter.set(0); 

     exchange.sendResponseHeaders(200, 2); 
     exchange.getResponseBody().write("OK".getBytes()); 
    } 
} 

И в методе main:

final AtomicInteger counter = new AtomicInteger(0); 
server.createContext("/test", new MyHandler(counter)); 
server.createContext("/reset", new ResetHandler(counter)); 

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

Отредактировано добавить: В клиенте можно указать метод запроса, как это:

final URL test = new URL("http://localhost:8000/test"); 
final HttpURLConnection connect = (HttpURLConnection) test.openConnection(); 
connect.setRequestMethod("POST"); 
+0

я пытался справиться с этим на том же пути, но как он будет сброшен? Если я обновляю, он все еще подсчитывается, но ничего не перезагружает. Как я POST что-то, чем? –

+0

@SebastianKawa см. Редактирование в нижней части ответа –

+0

awesome его работы. Спасибо чувак. У меня просто возникла проблема: если я сброшу его на 0, он начнет отсчет с 2. Я попытаюсь выяснить, почему. Если у вас есть какие-либо советы, пожалуйста. –

Смежные вопросы