我对haskell网络(以及一般的点对点通信)相当新,并且正在寻找一种玩家到玩家联网的刽子手游戏,类似于流行的"和朋友一起玩".在完成了一些教程,包括haskell.org的"实现聊天服务器"之后,我能够成功创建一个服务器并将套接字连接到套接字,然后弹回消息和第四个消息.
我还有一个刽子手客户端,在给定预定输入时按预期播放.
但是,我遇到了连接客户端之间排序事件的问题.因为读取和写入套接字通道发生在不同的线程上(由于readChan和writeChan的阻塞性质),我不确定如何在远程终端之间对动作进行排序.我知道我想要什么,而不是如何到达那里:
我已经走了几步.我更成功的方法之一是通过阻塞信号量.我曾经想过随着"控制"玩家的转变而使用MVar.它在第一个转弯时正确运行,但此后降级为乱码.一个信号的信道内的概念(这基本上是它的方式太块的无功)真的把我的头搞乱.因为它确实阻止了,它的证明也很难调试.
我对信号量的了解有点不稳定.我这样做的方式是否有意义?
代码可以在bitbucket存储库中找到.以下是获取正确代码/分支所需的步骤:
git clone git@bitbucket.org:ndisidore/haskell-hangman.git
git checkout block-sem
Run Code Online (Sandbox Code Playgroud)
或在线查看.
跑步: runhaskell NetInterface.hs
这会创建一个侦听端口3468的套接字
要作为客户端/播放器连接,请打开一个单独的终端并运行"telnet localhost 3468".这需要做两次,每个玩家一次.
提前致谢.