2012-03-29 34 views
9

Đối với một dự án giáo dục nhỏ được dự định là tài nguyên cộng đồng để giúp mọi người tìm hiểu Scala, tôi đang tìm kiếm một cách đơn giản để phục vụ và xử lý các trang web trong một chuỗi nền.Scala: làm thế nào để nhúng một máy chủ web nhỏ vào một ứng dụng scala?

Nền tối thiểu: Scalatron là một trò chơi nhiều người chơi trong đó người chơi khai thác các chương trình bot (viết bằng Scala) với nhau. Nó đi kèm với một hướng dẫn từng bước Scala. Hiện tại, người chơi cần sử dụng một IDE trên các máy cục bộ của họ để biên dịch chương trình, sau đó được xuất bản vào trò chơi bằng cách sao chép chúng vào một thư mục mạng chia sẻ. Đây là cồng kềnh. Đối với các phiên bản tiếp theo nó sẽ được tốt đẹp để cung cấp trình duyệt dựa trên bot chỉnh sửa và xuất bản để tối đa đơn giản hóa việc thiết lập cho cả hai nhà tổ chức và người chơi.

Tôi đã có một chuỗi nền hoạt động sẽ biên dịch mã nguồn Scala đến trên máy chủ khi đang di chuyển (tránh sự cần thiết cho một IDE đầy đủ). Tiếp theo, tôi phải chạy một máy chủ web nhỏ để cung cấp một điểm truy cập cho người chơi và để xử lý tải lên bot (điều này sẽ loại bỏ phần mạng).

Yêu cầu rất cơ bản: ban đầu tôi dự tính sẽ phục vụ một trang với hộp chỉnh sửa và nút "Go" (= tải lên máy chủ, biên dịch & xuất bản vào trò chơi); Tôi hy vọng không quá 20 người dùng đồng thời không có nhiều hơn một lần tải lên bot trên tất cả người dùng sau mỗi 5 hoặc 10 giây; Tôi cần phải giữ trạng thái tối thiểu cho mỗi người dùng (chỉ là một tên) và tôi cần phải trả lại thông báo lỗi trình biên dịch cho người dùng. Lưu ý rằng cập nhật màn hình trò chơi sẽ KHÔNG được hiển thị trong trình duyệt nhưng trên máy chiếu được gắn vào máy chủ. Và chủ yếu là để cho phép thiết lập đơn giản nhất có thể (nhấp đúp chuột vào máy chủ trò chơi .jar) Tôi nghĩ rằng nó sẽ là tốt đẹp để chạy máy chủ web trong một chủ đề nền trong máy chủ trò chơi hiện có.

Cách thích hợp nhất để thực hiện việc này là gì? Tôi có nên sử dụng một số khung hiện có, như Play hoặc Lift không? Có mã hiện tại để làm một cái gì đó rất giống với điều này? Có hợp lý để lập kế hoạch để chạy một máy chủ web trong một chủ đề nền như thế này? Bất kỳ lời khuyên nào được đánh giá cao.

Trả lời

2

Một trong những thùng chứa máy chủ web/servlet được nhúng nhỏ nhất được sử dụng trong thế giới Java là Jetty. Vì Scala có thể dễ dàng sử dụng các thư viện Java, nên dễ dàng sử dụng nó từ Scala.

This page hiển thị một số ví dụ đơn giản (bằng Java) về cách bắt đầu làm ví dụ như máy chủ HTTP được nhúng.

+0

Tuyệt vời, sẽ kiểm tra xem ra, cảm ơn! –

+0

Tôi có mọi thứ làm việc với Jetty. Cảm ơn vì tiền hỗ trợ. –

0

Khi bạn muốn cung cấp một khuôn khổ, tôi nghĩ rằng giải pháp tốt nhất là sử dụng một khung công tác hiện có, theo cách đó bạn sẽ không phải bận tâm đến việc phát minh lại nội dung.

Từ kinh nghiệm cá nhân của tôi, điều đó thực sự chủ quan, tôi khuyên bạn nên sử dụng Lift vì tôi biết rằng nó rất mạnh mẽ để hỗ trợ các phiên, đoạn mã toàn cầu và các nội dung khác. Bạn có thể thử mở rộng cổ điển chat app được sử dụng làm ví dụ về cách hoạt động của thang máy, kiểm tra thời tiết có ích cho việc sử dụng của bạn hay không không nên dài.

+0

OK, cảm ơn, tôi sẽ xem xét điều đó. –

3

Embedding Jetty khá dễ dàng, là một trong những mục tiêu chính cho dự án Cầu tàu. Nếu bạn cần đơn giản, đây là tuyến đường nhanh nhất. Tôi nghi ngờ bạn sẽ nhanh chóng cần một giải pháp mạnh mẽ hơn (mô hình, định tuyến, mẫu, v.v.) để sử dụng một khung như Lift hoặc Play Framework sẽ là một ý tưởng tốt hơn.

10

Máy chủ web nhúng là chính xác những gì Unfiltered được tạo cho. Triết lý cơ bản cho Unfiltered là máy chủ web chỉ là một thư viện mà bạn gọi từ mã của bạn, thay vì mã của bạn là một cái gì đó mà các cuộc gọi khuôn khổ web.

+0

Cảm ơn, điều đó thật tuyệt vời. Tôi sẽ xem qua nó. –

+0

Điều đó thật hoàn hảo, ước gì tôi có thể đưa ra một phụ đề. Tôi đã tạo ** một dự án sử dụng nó để học Scala. – aitchnyu

+0

Đối với trường hợp sử dụng rất nhỏ, tôi đã có vẻ phức tạp hơn bảo hành để tránh một cái lồng nhẹ 'if', đặc biệt là vì tôi cần Jetty hoặc một cái gì đó như thế. Got Jetty được tích hợp và hoạt động trong khoảng một giờ. Có thể Unfiltered sẽ trả hết tiền khi mọi thứ có liên quan nhiều hơn. –

1

Dưới đây là một vài ví dụ khác nhau nhúng container Java và các khuôn khổ Scala:

Trong khi cả hai nói chuyện về việc chạy các ứng dụng trên Heroku, bạn có thể chỉ cần chạy chúng như các ứng dụng Scala độc lập.

1
val webServer = new Thread("Web Server") { 
    def response(text: String, code: String = "200 OK") = 
    """HTTP/1.0 """ + code + """ 
    Content-Type: text/html 
    Content-Length: """ + text.length + """ 

    """ + text 

    override def run { 
    for(port <- env.webPort) { 
     val ss = new ServerSocket(port) 
     while (true) try { 
     val s = ss.accept 
     try { s.getOutputStream.write(response(someStuff.toString).getBytes) 
     } finally { s.close } 
     } catch { case ie: InterruptedException => return } 
    } 
    } 
} 

Xem thêm scala kittens

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