(轻量级)Instant Messenger:C#.Mono、node.js 还是其他?
Posted
技术标签:
【中文标题】(轻量级)Instant Messenger:C#.Mono、node.js 还是其他?【英文标题】:(lightweight) Instant Messenger: C#.Mono, node.js or other? 【发布时间】:2011-05-31 12:29:53 【问题描述】:我应该使用哪种编程语言来编写 Instant Messenger? 以下是目标:
应该能够处理许许多多的用户(至少用于概念证明) 协议应该基于 json 或者二进制数据。我猜 json 更容易实现和扩展。由于开销,我不想使用 XML。我知道这不是很多数据,但它应该尽可能快,尤其是在慢速网络(例如移动网络)上。 用户应该能够同时在多个设备上登录 历史记录应保存在服务器端,以便在所有设备上查看 服务器应保持大量空闲客户端处于活动状态 文件传输(不太清楚如何实现,可能是不同的网络套接字,所以它不会阻塞客户端的聊天消息) mysql 身份验证(不,XMPP 不是一个选项)。
我是一名 Web 开发人员,在 php 方面拥有丰富的经验,但这不是这个项目的选择。我也有 javascript 的经验(主要用于网站),但我很容易使用 node.js,而且我对 C#.Net 的经验很少,也可以编写 C#.Mono。我要编写的服务器应该在 Linux 上运行。我没有使用 Java 的经验,但如果这是我学习它的最佳方式的话。
我读过很多关于 node.js 的文章,它的事件 I/O 对网络应用程序和 Web 服务器非常有用。但是即时通讯工具呢?主要部分是保存消息并将它们代理给其他房间参与者,所以它是“网络”。
我还考虑过提供异步套接字的 C#,它使用线程池 afaik 而不是事件队列。
我不确定哪一个对于 IM 服务器最有效。
如果有人能给我一个提示,那就太好了。我知道 C++ 可能是最好的方法,但不知何故我不太喜欢这种语言,而且很难学习。
【问题讨论】:
【参考方案1】:您可以使用任何普通的编程语言(C#、Java、C++ 等)来完成所有这些操作,只要您对该语言有足够的能力。
【讨论】:
【参考方案2】:任何这些解决方案都可以。您可以用几乎任何语言编写事件网络代码 - 是的,在这样的场景中使用它非常酷。
如果您想要一些能够为您提供某种框架以更轻松联网的东西,我建议您尝试 Erlang,但对于单个项目来说可能很难学习。 node.js 可能在死连接上的保活/资源管理以及您没有真正得到事件的类似场景方面很棘手。
如果您已经熟悉 c#,那么使用 mono 对您来说可能是最安全/最快的方法。除此之外 - 你可以用任何语言写任何东西 - 只需使用你喜欢的东西(除非你真的想学习新东西)。
我不知道你为什么写 jabber 不是一个选项,但如果它只是你不想要的 xmpp 技术,为什么不使用典型的 SIP 代理/服务器呢? (例如 OpenSIPS)它有 MESSAGE 请求处理、订阅、授权(使用 db)和 keepalives 已经可用。您可以以几乎任何您想要的方式扩展/集群/分片 OpenSIPS。
【讨论】:
我对网络并没有真正的经验......在这样的项目中,异步套接字比同步套接字更好吗?聊天消息通常很小,只会阻塞几毫秒。 发送 tcp 消息可以阻塞任意时间。您可以使用线程或异步套接字来解决这个问题。如果你真的想为大量用户扩展,你永远不想阻塞——只要你知道有可能就排队并发送。甚至可能使用异步调度程序的线程池也是可行的方法,因为您必须交错保持活动、正常消息和文件传输。 这是我最初问题的一部分。使用 node.js,JS 引擎为我完成了这些工作,因此我可以将聊天消息作为事件处理。在 C# 上我有机会使用线程池(我认为 C# 上的 BeginX 已经使用了线程池。否则它会产生并杀死大量线程) 除非我错过了什么,否则在 node.js 中处理空闲连接并不容易。您可以推迟发送,但这并不能告诉您有关当前状态的太多信息,并且 keepalive 可以自行开始排队。你留下了你必须清理的死状态/套接字(只需谷歌对死连接进行 node.js 资源管理,看看会出现多少不明显的情况) 在node.js中处理空闲连接是没有问题的,即使你想确保连接不超时:每X秒向每个客户端发送一次ping,所有超时的客户端都会被检测为走了。以上是关于(轻量级)Instant Messenger:C#.Mono、node.js 还是其他?的主要内容,如果未能解决你的问题,请参考以下文章
Android 进阶——轻量级跨进程传递Message利器Messenger详解
Android 进阶——轻量级跨进程传递Message利器Messenger详解
Android 进阶——轻量级跨进程传递Message利器Messenger详解
Messenger(AIDL 的轻量级替代品)能否用于跨应用通信?