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