簡體   English   中英

haskell websocket示例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM