通过网络排序事件(网络化回合制游戏)

时间:2012-05-04 18:44:18

标签: multithreading sockets networking haskell semaphore

我对haskell网络(以及一般的点对点通信)相当新,并且正在寻找一种玩家到玩家联网的刽子手游戏,类似于流行的“和朋友一起玩”。在完成了一些教程,包括haskell.org的“实现聊天服务器”之后,我成功地创建了一个服务器并将套接字连接到套接字,然后弹回消息和第四个。

我还有一个刽子手客户端,在给定预定输入时按预期播放。

但是,我遇到了连接客户端之间排序事件的问题。因为读取和写入套接字通道发生在不同的线程上(由于readChan和writeChan的阻塞性质),我不确定如何在远程终端之间对动作进行排序。我知道我想要什么,而不是如何到达那里:

  1. 第二个用户连接后,调用“发送”功能,提示他们输入第一个玩家的输入字
  2. 玩家1通过“接收”功能接收此单词,并且,如果它不是命令关键字(加入,退出,结果),则使用提供的单词运行刽子手游戏。同时,玩家2的屏幕阻塞,等待玩家1完成。
  3. 玩家1完成。记录他的结果,然后为他调用“发送”功能,提示他输入游戏。
  4. 重复2-3直到玩家退出。
  5. 我已经解决了这个问题。我更成功的方法之一是通过阻塞信号量。我曾经想过随着“控制”玩家的转变而使用MVar。它在第一个转弯时正确运行,但此后降级为乱码。一个通道内的信号量的概念(它本质上是一个MVar,它也会阻挡它的方式)真的让我头疼。因为它确实会阻塞,所以它也很难调试。

    我对信号量的了解有点不稳定。我这样做的方式是否有意义?

    代码可以在bitbucket存储库中找到。以下是获取正确代码/分支所需的步骤:

    git clone git@bitbucket.org:ndisidore/haskell-hangman.git
    git checkout block-sem
    

    view it online here

    运行:runhaskell NetInterface.hs

    这会创建一个侦听端口3468

    的套接字

    要作为客户端/播放器连接,请打开一个单独的终端并运行“telnet localhost 3468”。这需要做两次,每个玩家一次。

    提前致谢。

0 个答案:

没有答案