我正在用Java编写国际象棋程序。 GUI应该能够与支持Chess Engine Communication Protocol的国际象棋引擎通信。但是我在协议与Java的I / O设施协调方面遇到了一些困难。
由于早于协议版本2的引擎不发送“功能”,因此xboard使用超时机制:当它首次启动引擎时,它会发送“xboard”和“protover N”,然后在两秒钟之前侦听功能命令发送任何其他命令。
似乎Java的中断I / O操作的设施有限。我能找到的唯一选择是NIO的InterruptibleChannel
,它会在被打断时关闭。
我不希望在超时发生时关闭流 - 我只想中断读取。有谁知道解决方案?
答案 0 :(得分:4)
我认为你可能会过度思考这个问题。您不需要在2秒后中止read()
调用,您只需要您的支持逻辑来理解在2秒后它不应该期望接收任何“功能”命令。然后你的实现可以编写下一个命令,你的read()
将返回响应该命令的字节。
这就是我无论如何都要接近它,通过使用通用代码读取字节并将它们传递到可以完成特定于上下文的处理的链中。然后您不需要中断读取,上游代码只需要了解它最终返回的数据可能是“功能”命令,或者它可能不是。
答案 1 :(得分:2)
我不清楚你需要做多少事情。你引用的是电路板的超时行为。你不必在电路板上实现它,它是对等的,即另一端。