梦想总是伟大的。想要创建一个从头开始的聊天系统,它快速、可靠且轻量级,没有任何问题。然而,对于新程序员来说,大多数雄心勃勃的项目很快就会被否决,也不例外。搜索并努力寻找一个体面的系统或体面的代码,可以让在两个客户端之间进行简单的通信,并通过一个集中的服务器。显然,对来说很难找到(直到几年后才能熟练使用谷歌),任何能完全满足需求的东西。
几年过去了,积累了更多的技能,决定,“嘿,应该写那个聊天系统”。所以就这么做了。它很糟糕,但学到了很多东西。
RattleSnake是学到的东西的一个例子。
想要一个灵活的系统,它可以接收给它的任何东西,并产生想要的结果。这听起来真的很愚蠢,但请耐心听说。想要能够序列化结构,或者发送自定义编码的字节数组,而不必改变发送方法。
RattleSnake可以做到这一点。
这最初是一个宠物项目,已经演变成一个庞大的东西。RattleSnake可以处理实际想要的几乎所有事情,从客户端-服务器连接,甚至处理UPnP。
RattleSnake有4个主要的命名空间:
请注意,这个类不是创建的。只是从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类的方法、属性和枚举的列表:
每个方法都有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的第三次重写,以提供更干净、更高效的代码。