希望创建一款类似MUDs/MUCKs的游戏,但需要有头像或地点插图。我选择使用ruby语言。
我需要处理多个持久连接,实现服务器和客户端之间异步传输数据。必须保持单个数据库基于客户端会话中发生的活动而更新。每个客户端会话中的活动可能需要立即更新其他多个客户端(例如:一个用户进入房间;一个用户给另一个用户发送私人消息)。
这是一个目标项目和学习项目,因此我的意图是重复发明某些轮子,以了解更多关于并发网络编程的知识。然而,我对并发和网络编程都很陌生;以前我几乎完全在非持久、同步的HTTP请求的Web应用程序中工作。因此,我想确保我正在重复发明正确的轮子。
根据emboss的出色回答,我开始研究某些HTTP服务器的内部实现,因为Web应用程序通常可以避免线程问题,因为这些问题被服务器本身彻底抽象化了。
我不想使用EventMachine或GServer,因为我还不理解它们做什么。一旦我对它们的工作原理有一个基本的概念,知道它们解决了哪些问题以及它们为什么有用,我就会感到舒适。我的目标不是"写一个游戏",而是"写一个游戏并了解一些更底层的东西"。我也不清楚某些术语的边界;例如,"I/O未绑定的应用程序"是否是"事件驱动应用程序"的超集?反之亦然?
当然,如果存在一种正确的方法来实现我的目标,我当然很感兴趣,但总体上我想了解为什么它是正确的方式,为什么其他方法不太可取。
任何书籍、电子书、在线资源、示例项目或其他建议都是我真正想要的。
我目前的做法是使用IO#select
阻塞在已连接套接字列表上,超时时间为0.1秒。它将读取到的任何信息推送到线程安全的读取队列中,每当达到超时时间时,就从线程安全的写入队列中获取数据。我不确定超时时间是否应该更短。还有第二个线程轮询套接字处理线程的读取队列并处理"请求"。这比我最初的处理方式要好,但可能仍不理想。我在Hacker News上发布了这个问题,并得到了一些链接资源,我正在学习;类似的东西很好: