[英]haskell websocket example
import Network
import System.IO
import Control.Concurrent
import Control.Monad(when)
import Char
serverHandshake :: String
serverHandshake =
"HTTP/1.1 101 Switching Protocols\r\n\
\Upgrade: WebSocket\r\n\
\Connection: Upgrade\r\n\
\Sec-WebSocket-Accept: *******************\r\n\r\n"
acceptLoop socket = forever $ do
(h,_,_) <- accept socket
------------------------
hPutStr h serverHandshake
hSetBuffering h NoBuffering
forkIO (listenLoop h)
where
forever a = do a; forever a
main = withSocketsDo $ do
h <- listenOn (PortNumber 8000)
acceptLoop h
sClose h
return ()
listenLoop :: Handle -> IO ()
listenLoop h = do
sendFrame h "aleloia"
msg <- readFrame h
putStrLn msg
when (msg /= "quit") (listenLoop h)
readFrame :: Handle -> IO String
readFrame h = readUntil h ""
where
readUntil h str = do
new <- hGetChar h
if new == chr 0
then readUntil h ""
else if new == chr 255
then return str
else readUntil h (str ++ [new])
sendFrame :: Handle -> String -> IO ()
sendFrame h s = do
hPutChar h (chr 0)
hPutStr h s
hPutChar h (chr 255)
1)當有“ forkIO(listenLoop h)”時,為什么將“ forever a = do a; forever a”用作“ forever a = do a; forever a”? 換句話說,開始派生新進程,直到我的電腦崩潰? 如果會有一個永遠的循環,我希望它會出現在主要的地方嗎?
2)---和* * *是一些我尚未在互聯網上找到的尚未實施的RFC內容,是否有haskell電池?
參考: http : //www.fatvat.co.uk/2010/01/web-sockets-and-haskell.html
人們可以在Haskell中編寫這樣的代碼是有原因的。 在調用forkIO函數時,Haskell使用“綠色線程”,這些線程通常在單個線程中運行,直到它們有理由阻塞為止,此時它們很可能會使用某種線程池機制來獲取要阻塞的線程。上。 此功能加上狀態事務monad,使在Haskell中設計並發應用程序變得異常簡單。
如果您想使用OS線程,則可以使用forkOS函數。
http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent.html
此外,用於GHC的Network.Socket模塊會盡可能使用非阻塞IO功能,所有這些功能對用戶都是隱藏的。
大概accept
是一個阻塞函數調用,因此forever
使用不是叉子炸彈。 至於為什么要這樣做,我認為這是偵聽套接字以接受請求的連接數量的程序的相當標准的做法。
我不確定100%是否確實為代碼的缺失部分提供了“ Haskell電池”,但是Hackage上肯定有幾個帶有名稱或描述的websocket軟件包; 您應該查看這些內容,然后發布更具體的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.