gpt4 book ai didi

networking - Haskell:如何使用 forkIO 使多个客户端连接到服务器?

转载 作者:行者123 更新时间:2023-12-02 01:54:23 26 4
gpt4 key购买 nike

我正在尝试让多个客户端连接到服务器。我设法做的是通过使用服务器将一个客户端连接到服务器:

main = withSocketsDo $ do 
socket <- listenOn port
(handle, host, portno) <- accept socket
hSetBuffering handle LineBuffering
msg <- hGetLine handle
putStrLn $ "The client says: " ++ msg
hClose handle
sClose socket
putStrLn "Server is done."

对于客户:
main = withSocketsDo $ do
handle <- connectTo "localhost" port
hSetBuffering handle LineBuffering
hPutStrLn handle "Hello!"
hClose handle

这些显然只是为了测试目的;)

现在,我读到我需要使用 forkIO 来启用多个客户端连接到这台服务器。但是,我一直无法找到应该如何使用 forkIO 或如何管理将连接的多个客户端。有人可以向我解释我应该做什么吗?

提前致谢!

最佳答案

关键是一旦你接受了使用 accept 的连接,您将需要在主线程返回监听时 fork 一个新线程来处理连接。所以这样的事情应该可以解决问题。

main = withSocketsDo $ do 
socket <- listenOn port
-- We want to accept multiple connections,
-- so we need to accept in a loop
forever $ do
(handle, host, portno) <- accept socket
-- But once we've accepted, we want to go off and handle the
-- connection in a separate thread
forkIO $ do
hSetBuffering handle LineBuffering
msg <- hGetLine handle
putStrLn $ "The client says: " ++ msg
hClose handle

请注意,这种方式服务器会一直运行,直到您终止进程,这是许多服务器的常见行为。实现更优雅的关闭将需要使用 MVars 或 STM 进行一些跨线程通信。

关于networking - Haskell:如何使用 forkIO 使多个客户端连接到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8042286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com