gpt4 book ai didi

haskell - Haskell 中的游戏服务器

转载 作者:行者123 更新时间:2023-12-03 22:28:16 25 4
gpt4 key购买 nike

我正在使用 NetworkGloss用于 Haskell 中的游戏服务器。它工作正常,除了客户端必须关闭服务器才能接收它发送的数据。我敢打赌,这是一个懒惰的例子......

极简服务器:

import Network
import System.IO

main = do
sock <- listenOn (PortNumber (fromIntegral 12345))
loop sock

loop sock = do
(hIn, _, _) <- accept sock
str <- hGetContents hIn
print str
loop sock

极简客户:
import Network
import System.IO
import Graphics.Gloss.Interface.IO.Game

main = playIO
(InWindow "Test Multi" (500, 500) (500, 500))
white
60
Nothing
draw
(\_ x -> return x)
advance

draw Nothing = return blank
draw (Just x) = return (Text (show x))

advance _ Nothing = do
hOut <- connectTo "000.000.0.0" (PortNumber (fromIntegral 12345))
hSetBuffering hOut NoBuffering
hPutStr hOut "Hello!"
return (Just hOut)
advance _ x = return x

我启动服务器,等待 10 秒,然后启动客户端,等待 15 秒,看到服务器上没有任何 react ,关闭客户端,看到“你好!”突然出现在服务器上。
我想要“你好!”在客户端运行时出现,在 advance 中打电话,否则我无法制作多人游戏(呜咽)!

但是,如果我将客户的代码更改为
main = loop Nothing
loop x = do
x' <- advance 0 x
getLine

服务器立即显示“你好!”当客户在等待我的输入时。

正如另一个问题中所建议的那样,我尝试使用爆炸模式和 hClose :
-- ...
!str <- hGetContents hIn
hClose hIn
-- ...

这使得输出立即出现,而无需关闭客户端。那太棒了。但是,我打算使用字节串,因为我发送到服务器的数据是序列化的,所以我 import qualified Data.ByteString as B并更改 hGetContentsB.hGetContents ,这使得问题再次出现。

这个问题确实是一个懒惰的例子。 hGetContents懒洋洋地读取 Handle 的所有内容,所以它只在它关闭时完成,当客户端中止连接时。相反,我使用了 hGetLine每次遇到 \n 时都会返回内容,我将其用作 end-of-message标签。

最佳答案

我可能完全错了,但问题不是 hGetContents 吗?当然,这应该等到通过您的套接字发送的全部内容到达下一行(打印...)之前。 hGetContents 旨在为您提供在套接字关闭之前发送的所有内容。 hGetLine 之类的东西可以立即终止,您可以让套接字保持打开状态,以便稍后发送更多数据。然后,您的客户端可以使用 hPutStrLn 而不是 hPutStr。

关于haskell - Haskell 中的游戏服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12134097/

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