介绍
当我刚开始编程的大约5年前,我是在做梦大。我想从头开始,没有问题,快速,可靠和轻量级的聊天系统。
然而,新程序员的最雄心勃勃的项目得到真正的快速击落,这是没有什么不同。我搜查,并努力寻找一个体面的系统或体面的代码将允许我做一些简单的沟通,有一个集中的服务器的客户。显然,这是相当困难的,我找到我没有得到很好的与谷歌,直到几年后,会做正是我想要的东西。
几年去,我收集更多的技能,我决定,quot;嘿,我应该写的聊天systemquot。所以,我就是这样做的。这臭气冲天耶,但我学到了不少东西。响尾蛇是我学到的东西的一个例子。背景
我想一个灵活的系统,将采取什么我给它,并产生我想要的东西。这听起来很愚蠢的探测,但原谅我。我想成为能够序列化的结构,或者发送自定义编码的字节数组,而无需改变我发送方法。响尾蛇可以做到这一点。
作为宠物的项目,并已开始演变成大规模。响尾蛇可以处理,只是不管你实际需要,从客户端 - 服务器连接,甚至处理的UPnP。
响尾蛇有4个主要的命名空间:RattleSnake.ClientRattleSnake.Client.ClientRattleSnake.Client.TcpClientExRattleSnake.ServerRattleSnake.Server.ServerRattleSnake.Server.TcpListenerExRattleSnake.SecurityRattleSnake.Security.WhirlpoolManaged请注意这个类是不是我的创作。我只是从C#转换。原许可证和类的通知仍然在地方信贷的原始作者。RattleSnake.Security.MersenneTwister至于与WhirlpoolManaged,我没有创建这个。我只是从C#转换。原许可证和类的通知仍然在地方信贷的原始作者。RattleSnake.Security.EncryptionRattleSnake.UPnP
,它很清楚每个命名空间实际上包含什么,它做什么。
我不得不这样做继承少数情况下,如继承的TcpClient放大器;的TcpListener提供未来的功能(例如物业MyBase.Active())我更新这个项目。不过,现在,响尾蛇是比较完整的减我想放进去的几个新特点使用代码
这是非常简单的使用响尾蛇的客户端,服务器,UPnP的,和安全功能。客户端和服务器是完全事件驱动,使得它非常简单易懂。
下面是一个使用客户端的简单的例子:' This is for the Client.
Dim _rsc As New RattleSnake.Client.RattleSnakeClient()
' Now perform a connection
_rsc.Connect("127.0.0.1", 6110)
这是所有你需要做的进行连接。但是,如何保持客户端连接时的轨道?接收数据,或断线,甚至是一个例外呢? RattleSnakeClient类处理所有的事件:{C}
将触发此事件时,建立连接。的EventArgs通过包含以下属性:IP - 返回的IP地址,客户端连接(作为String)。港口 - 返回客户端连接(端口)的端口号。Public Event DataReceived(ByVal sender As Object, _
ByVal e As EventArgs.RattleSnakeClientDataReceivedEventArgs)
将触发此事件当数据通过连接。的EventArgs通过包含以下属性:数据 - 返回一个字节数组,其中包含已接收的所有数据。
对象 - 返回一个对象,表示接收到的数据通过系列化的尝试。如果序列化失败,它将返回一个新的对象。{体C3}
将触发此事件时RattleSnakeClient抛出一个异常。的EventArgs通过包含以下属性:例外 - 返回被抛出的异常。
这些事件是简单,直观,并保持响尾蛇平稳运行
发送数据与响尾蛇也非常简单。
这是容易与响尾蛇发送数据。它也可以简单地传递BeginSend()的方法,是Serializable对象以及发送;响尾蛇在内部使用。
断线是一件轻而易举的:{C5的}
响尾蛇,除非它真的很重要,断开()将始终采取一个真正的。真告诉响尾蛇通知对方断线发生。我这样做只是为了确保有另一端,否则可能避免提出没有例外。
现在,在响尾蛇的UPnP类的快速概览。 UPnP的类允许快速和轻松地添加端口映射(或搬迁)的UPnP设备。这是一个的UPnP类的方法,属性,枚举列表:协议的TCPUDP的删除()()LocalIP()打印()Dispose()方法
每一种方法都有XML风格的注释,所以我不会去到很多细节,但它很容易添加一个端口映射到一个UPnP功能的设备:
这是所有需要添加端口映射到一个UPnP功能的设备。代码添加到本地IP地址映射,端口100的TCP协议和描述quot; Descriptionquot;删除很简单,因为:{C7-}
,只是刚才添加的端口已经被删除。 ()和删除()例程内部调用(),所以,作为一个程序员,它不要求做到这一点,以及(然而,该类将引发ArgumentException())。
响尾蛇,作为一个整体,不应该是漏洞百出。它已经历了多次实地测试,没有在所有的许多错误,但如果任何错误弹出,我会尽我所能尽快解决这些问题。景点
我要指出,响尾蛇已经看到了它的公平份额重写。截至2011年12月5日,这是第三响尾蛇提供更清洁,更高效的代码重写。 UPnP是最近除了响尾蛇,我花了一点研究,找出如何在Windows中很容易做到。我用的是"轻松"而不是松散的,因为它是相对简单,但需要搞清楚位,使其工作(例如,它只是在我相信。NET 3.5和以上所需的接口没有暴露在NET 2.0 )。历史2011年12月5日 - 初始释放