2015-10-24 121 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

在您給出的代碼中,MyHandler的方法handle處理對/test路徑的請求。所以你應該決定的第一件事是,如果你想在同一條路徑上或不同的路徑上收到復位命令?

如果你要處理的同一路徑上,那麼你就需要修改MyHandler增加存儲在atomicInteger數量的要求來區分 - 我們稱之爲GET命令,並請求重置計數器 - 我們姑且稱之爲那POST命令。看看我們做了什麼?我們用兩個HTTP request methods來區分這兩個命令。現在你想改變MyHandler來實現它。在handle方法中,您收到t參數中具有getRequestMethod方法的HttpExchange對象。因此,代碼會看起來像:

@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相同。這最好通過在main方法中創建AtomicInteger並使用處理程序的構造函數將它傳遞給兩個處理程序來實現。這看起來是這樣的:

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

我試圖處理它在同一路徑上,但它將如何復位?如果我刷新它仍然計數,但不重置任何東西。我如何發佈比什麼? –

+0

@SebastianKawa在答案的底部看到編輯 –

+0

令人敬畏的工作。謝啦。我剛剛得到的問題是,如果我將它重置爲0,它將從2開始計數。我將試着找出原因。如果你有任何提示,歡迎你。 –