从零开始构建聊天系统

梦想总是伟大的。想要创建一个从头开始的聊天系统,它快速、可靠且轻量级,没有任何问题。然而,对于新程序员来说,大多数雄心勃勃的项目很快就会被否决,也不例外。搜索并努力寻找一个体面的系统或体面的代码,可以让在两个客户端之间进行简单的通信,并通过一个集中的服务器。显然,对来说很难找到(直到几年后才能熟练使用谷歌),任何能完全满足需求的东西。

几年过去了,积累了更多的技能,决定,“嘿,应该写那个聊天系统”。所以就这么做了。它很糟糕,但学到了很多东西。

RattleSnake

RattleSnake是学到的东西的一个例子。

想要一个灵活的系统,它可以接收给它的任何东西,并产生想要的结果。这听起来真的很愚蠢,但请耐心听说。想要能够序列化结构,或者发送自定义编码的字节数组,而不必改变发送方法。

RattleSnake可以做到这一点。

这最初是一个宠物项目,已经演变成一个庞大的东西。RattleSnake可以处理实际想要的几乎所有事情,从客户端-服务器连接,甚至处理UPnP。

RattleSnake有4个主要的命名空间:

  • RattleSnake.Client
  • RattleSnake.Client.Client
  • RattleSnake.Client.TcpClientEx
  • RattleSnake.Server
  • RattleSnake.Server.Server
  • RattleSnake.Server.TcpListenerEx
  • RattleSnake.Security
  • RattleSnake.Security.WhirlpoolManaged
  • RattleSnake.Security.MersenneTwister
  • RattleSnake.Security.Encryption
  • RattleSnake.UPnP

请注意,这个类不是创建的。只是从C#转换过来的。原始的许可证和通知仍然保留在类中,以归功于原始作者。

使用RattleSnake的客户端、服务器、UPnP和安全功能非常简单。客户端和服务器完全是事件驱动的,这使得理解起来相当简单。

以下是使用客户端的快速示例:

Dim _rsc As New RattleSnake.Client.RattleSnakeClient() _rsc.Connect("127.0.0.1", 6110)

这就是执行连接所需的全部。但是,如何跟踪客户端何时连接?接收数据、断开连接或异常怎么办?RattleSnakeClient类有事件来处理所有这些:

Public Event ConnectionEstablished(ByVal sender As Object, ByVal e As EventArgs.RattleSnakeClientConnectionEstablishedEventArgs) Public Event DataReceived(ByVal sender As Object, ByVal e As EventArgs.RattleSnakeClientDataReceivedEventArgs) Public Event Exception(ByVal sender As Object, ByVal e As EventArgs.RattleSnakeClientExceptionEventArgs)

这些事件简单、直接,使RattleSnake运行顺畅。

使用RattleSnake发送数据也非常简单:

Dim _data As New Byte(255) {} _rsc.BeginSend(_data)

使用RattleSnake发送数据就是这么简单。也可以简单地将一个可序列化的对象传递给.BeginSend()方法,它也会被发送出去;RattleSnake内部利用了这一点。

断开连接也很简单:

_rsc.Disconnect(True)

在RattleSnake中,除非真的很重要,.Disconnect()总是会取一个True。True告诉RattleSnake通知对方正在发生断开连接。这样做只是为了确保在另一端不会引发可以避免的异常。

RattleSnake中的UPnP类允许快速且轻松地添加(或移除)UPnP启用设备上的端口映射。这是UPnP类的方法、属性和枚举的列表:

  • Protocol TCP UDP
  • Add() Remove() Exists() LocalIP() Print() Dispose()

每个方法都有XML风格的注释,所以在这里不会详细说明,但在UPnP启用设备上添加端口映射非常简单:

Using rs = New RattleSnake.UPnP.UPnP rs.Add(RattleSnake.UPnP.UPnP.LocalIP(), 100, RattleSnake.UPnP.UPnP.Protocol.TCP, "Description") End Using

这就是在UPnP启用设备上添加端口映射所需的全部。代码将本地IP地址上的端口100添加映射,使用TCP协议和"Description"的描述。移除也很简单:

Using rs = New RattleSnake.UPnP.UPnP rs.Remove(100, RattleSnake.UPnP.UPnP.Protocol.TCP) End Using

刚刚添加的端口现在已经被移除了。Add()和Remove()例程内部调用Exists(),所以作为程序员,不需要这样做(但是,类会抛出ArgumentException())。

作为一个整体,RattleSnake不应该充满bug。它已经经历了多次现场测试,几乎没有什么错误,但如果有任何bug出现,会尽所能尽快修复它们。

应该指出,RattleSnake已经经历了相当多的重写。截至2011年12月5日,这是RattleSnake的第三次重写,以提供更干净、更高效的代码。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485