2009-07-27 45 views
31

Tôi muốn nhúng một máy chủ HTTP rất nhẹ trong ứng dụng java swing của mình, chỉ chấp nhận các yêu cầu, thực hiện một số hành động và trả về kết quả.Máy chủ HTTP nhúng trong ứng dụng Java Swing

Có một lớp java rất nhẹ mà tôi có thể sử dụng trong ứng dụng của mình mà lắng nghe trên một cổng được chỉ định cho các yêu cầu Http và cho phép tôi xử lý các yêu cầu không?

Lưu ý rằng tôi không tìm kiếm một máy chủ http độc lập, chỉ là một lớp java nhỏ mà tôi có thể sử dụng trong ứng dụng java của mình.

Trả lời

67

Đáng ngạc nhiên, Sun JDK đã có chứa một đơn giản thực hiện máy chủ http (chỉ bắt đầu từ JDK 6). Xem JavaDoc

Usage:

import java.io.IOException; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Set; 
import java.util.concurrent.Executors; 

import com.sun.net.httpserver.Headers; 
import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

public class HttpServerDemo { 
    public static void main(String[] args) throws IOException { 
    InetSocketAddress addr = new InetSocketAddress(8080); 
    HttpServer server = HttpServer.create(addr, 0); 

    server.createContext("/", new MyHandler()); 
    server.setExecutor(Executors.newCachedThreadPool()); 
    server.start(); 
    System.out.println("Server is listening on port 8080"); 
    } 
} 

class MyHandler implements HttpHandler { 
    public void handle(HttpExchange exchange) throws IOException { 
    String requestMethod = exchange.getRequestMethod(); 
    if (requestMethod.equalsIgnoreCase("GET")) { 
     Headers responseHeaders = exchange.getResponseHeaders(); 
     responseHeaders.set("Content-Type", "text/plain"); 
     exchange.sendResponseHeaders(200, 0); 

     OutputStream responseBody = exchange.getResponseBody(); 
     Headers requestHeaders = exchange.getRequestHeaders(); 
     Set<String> keySet = requestHeaders.keySet(); 
     Iterator<String> iter = keySet.iterator(); 
     while (iter.hasNext()) { 
     String key = iter.next(); 
     List values = requestHeaders.get(key); 
     String s = key + " = " + values.toString() + "\n"; 
     responseBody.write(s.getBytes()); 
     } 
     responseBody.close(); 
    } 
    } 
} 

Hoặc bạn có thể sử dụng Jetty cho mục đích đó. Nó khá nhẹ và hoàn toàn phù hợp với mục đích này.

+3

Cảm ơn bạn đã đi thêm dặm và cung cấp mã ví dụ. Điều này hoàn toàn phù hợp với nhu cầu của tôi, hãy cổ vũ! – CodeAndCats

+0

Xin lỗi, tôi có thể hỏi bạn một câu hỏi khác liên quan đến ví dụ này? không chắc chắn làm thế nào heck để ngăn chặn các thread nó đang chạy trên? Ví dụ, nếu một khách hàng yêu cầu một url đặc biệt mà nói với nó để đóng, tôi có thể dừng máy chủ bằng cách gọi server.stop (0) nhưng bản thân ứng dụng dường như vẫn còn đang chạy? – CodeAndCats

+0

@Ivan - Bạn có thể cho tôi biết làm thế nào tôi có thể chuyển hướng đến một liên kết có thông điệp cảnh báo từ phương thức xử lý? Cảm ơn bạn – JHS

8

Bạn có thể sử dụng cầu cảng làm máy chủ nhúng, trọng lượng khá nhẹ của nó. Tùy chọn khác là kiểm tra điều này cho một lớp java đơn giản để xử lý các yêu cầu http http://java.sun.com/developer/technicalArticles/Networking/Webserver/.

cách khác là trong Java 6 bạn có thể sử dụng com.sun.net.httpserver.HttpServer

+0

Máy chủ web Java 6 là đặt cược tốt nhất nếu ứng dụng của bạn được triển khai trên các định dạng bằng Java 6. – Dave

+0

@Dave và Oracle JVM. –

+0

Cầu tàu không hoạt động bên trong Android. :( – tse

1

Nếu bạn không sử dụng Java 6, thì tôi chắc chắn sẽ giới thiệu Jetty. Điều đó hoạt động rất tốt và có một giao diện lập trình khá.

1

Bạn nói "rất nhẹ" hai lần, vì vậy tôi nghĩ rằng JLHTTP có thể là một kết hợp tốt cho bạn. Bạn có thể nhúng nó như một tệp nguồn đơn lẻ hoặc một tệp jar ~ 35K/50K, nhưng nó hỗ trợ hầu hết các chức năng bạn cần trong một máy chủ HTTP ra khỏi hộp.

Tuyên bố từ chối trách nhiệm: Tôi là tác giả. Nhưng hãy tự kiểm tra và xem suy nghĩ của bạn :-)

+0

một cái gì đó như thế tồn tại cho websockets? –

+1

Tôi xem xét việc thêm hỗ trợ websocket vào JLHTTP, nhưng nó quá khác và quá lớn để trở thành một phần của JLHTTP cốt lõi. Có lẽ một ngày nào đó tôi sẽ làm việc đó trong một dự án anh chị em riêng biệt ... – amichair

Các vấn đề liên quan