2010-02-05 15 views
29

डिफ़ॉल्ट एरलांग स्थापना का उपयोग करना वेब सर्वर उत्पादक "हैलो वर्ल्ड" बनाने के लिए आवश्यक न्यूनतम कोड क्या है?एरलांग में एक साधारण वेबसर्वर कैसे लिखें?

+0

यह कैसे http://stackoverflow.com/questions/2084639/sinatra-style-web-framework-for-erlang से अलग है? – Zed

+1

@Zed, जुबैर एक न्यूनतम "हैलो वर्ल्ड" सर्वर मांग रहा है - इसमें एक "पृष्ठ" है क्योंकि यह न्यूनतम है। आपके द्वारा लिंक किया गया प्रश्न पूछता है कि कैसे एक कार्यात्मक वेब ऐप बनाना है (एक पृष्ठ, लेकिन विभिन्न तरीकों से विभिन्न अनुरोधों का जवाब देता है)। मुझे लगता है कि बाद वाला अजाक्स-वाई होगा। – apollodude217

उत्तर

49

शाब्दिक रूप से "उत्पादन" लेना, यहां एक बहुत छोटा है। यह अनुरोध भी नहीं पढ़ता है (लेकिन हर अनुरोध पर कांटा करता है, इसलिए यह न्यूनतम संभव नहीं है)।

-module(hello). 
-export([start/1]). 

start(Port) -> 
    spawn(fun() -> {ok, Sock} = gen_tcp:listen(Port, [{active, false}]), 
        loop(Sock) end). 

loop(Sock) -> 
    {ok, Conn} = gen_tcp:accept(Sock), 
    Handler = spawn(fun() -> handle(Conn) end), 
    gen_tcp:controlling_process(Conn, Handler), 
    loop(Sock). 

handle(Conn) -> 
    gen_tcp:send(Conn, response("Hello World")), 
    gen_tcp:close(Conn). 

response(Str) -> 
    B = iolist_to_binary(Str), 
    iolist_to_binary(
     io_lib:fwrite(
     "HTTP/1.0 200 OK\nContent-Type: text/html\nContent-Length: ~p\n\n~s", 
     [size(B), B])). 
+3

'head_tcp' के 'विकल्प' के लिए '{पैकेट, http}' देखें, HTTP शीर्षलेख डीकोडिंग के लिए सुनो '। – Pindatjuh

+1

मैं इस कोड को देख रहा था, और भले ही यह साफ दिखता है, मुझे एक समस्या मिली। अपाचे बेंच के साथ इसका परीक्षण करते समय, मुझे एक 'apr_socket_recv मिलता है: सहकर्मी द्वारा कनेक्शन रीसेट (104) '। ब्राउज़र में पहुंचने या कर्ल का उपयोग करते समय यह ठीक काम करता है। क्या आपको कोई विचार है कि यह क्यों है? –

+1

@MartinKristiansen लाइन को हटाएं 'gen_tcp: बंद करें (कॉन)। –

8

क्या आप वास्तव में एरलांग में एक वेब सर्वर लिखना चाहते हैं, या आप एक एरलांग वेब सर्वर चाहते हैं ताकि आप एरलांग का उपयोग करके गतिशील वेब सामग्री बना सकें?

यदि बाद वाला, YAWS आज़माएं। यदि पूर्व, YAWS source code पर प्रेरणा

+2

मैं गतिशील सामग्री बनाना चाहता हूं, लेकिन सिर्फ वेब सर्वर के लिए आवश्यक न्यूनतम न्यूनतम जानना चाहता था। मैंने यॉस स्रोत कोड को देखा और मेरी पहली छाप यह थी कि बहुत सारे कोड की आवश्यकता थी। – Zubair

12

केवल निर्मित पुस्तकालयों का उपयोग कर वेब सर्वर के लिए inets http_server देखें। जब कुछ और शक्ति की आवश्यकता होती है लेकिन अभी भी सादगी के साथ आपको mochiweb लाइब्रेरी की जांच करनी चाहिए। आप लोड कोड उदाहरण के लिए Google कर सकते हैं।

+1

बहुत अच्छा है, इसलिए आईनेट्स का उपयोग करके मैं एक मॉड्यूल वेबसर्वर लिख सकता हूं? – Zubair

5

शोकहारा क्षुधा या इस तरह के gen_webserver व्यवहार की जाँच के निर्माण के लिए एक बहुत उपयोग करने में आसान वेब सर्वर के लिए: http://github.com/martinjlogan/gen_web_server

1

फेलिक्स के उत्तर के लिए बस एक फिक्स और यह मार्टिन देख रहे मुद्दों को संबोधित करता है। सॉकेट बंद करने से पहले, क्लाइंट से भेजे गए सभी डेटा प्राप्त किए जाने चाहिए (उदाहरण के लिए do_recvgen_tcp description से)।

अन्यथा सॉकेट बंद होने से पहले HTTP अनुरोध भेजने के लिए HTTP अनुरोध भेजने के लिए ब्राउजर/प्रॉक्सी के लिए दौड़ की स्थिति है।

2

एक और तरीका, ऊपर gen_tcp उदाहरण के समान है लेकिन कम कोड के साथ और पहले से ही एक सुझाव के रूप में पेश किया गया है, inets library का उपयोग कर रहा है।

%%% 
%%% A simple "Hello, world" server in the Erlang. 
%%% 

-module(hello_erlang). 
-export([ 
    main/1, 
    run_server/0, 
    start/0 
]). 

main(_) -> 
    start(), 
    receive 
    stop -> ok 
    end. 

run_server() -> 
    ok = inets:start(), 
    {ok, _} = inets:start(httpd, [ 
    {port, 0}, 
    {server_name, "hello_erlang"}, 
    {server_root, "/tmp"}, 
    {document_root, "/tmp"}, 
    {bind_address, "localhost"} 
    ]). 

start() -> run_server().              

ध्यान रखें, यह आपकी /tmp निर्देशिका का खुलासा करता है।

चलाने के लिए, बस:

$ escript ./hello_erlang.erl 
संबंधित मुद्दे