打算把DTwisted开放出来
qiezi
2007-01-11
从twisted移植了一些接口过来,稍作了些简化,暂命名为DTwisted。在google code上申请了项目,却一直连接不上。
关于它的历史,可以看这里: D语言和python的差异 基本上编写它只有3天,加起来大概5小时吧,所以还很简陋,只实现了listen tcp,代码也只有400多行。文档和注释都没有写,因为中间架构修改太多了,现在基本上定型。协议打算采用BSD,我也不是很熟悉,好像这个协议是允许自由修改发布而且不必公开源代码。 下面是个使用范例: import std.socket; import std.stdio; import std.string; import dtwisted.reactor; import dtwisted.interfaces; import dtwisted.factory; import dtwisted.protocol; class Echo : dtwisted.protocol.Protocol{ protected: void dataReceived(char[] data){ writefln("Received %d bytes", data.length); transport.write(data); transport.loseConnection(); } void connectionMade(){ writefln("connectionMade"); } void connectionLost(){ writefln("connectionLost"); } } class DummyLineReceiver : LineReceiver{ protected: void lineReceived(char[] line){ writefln("Received line, has %d bytes", line.length); } } void main(char[][] args){ int port = 4444; if (args.length > 1) port = atoi(args[1]); IReactor reactor = new SelectReactor; void test(){ writefln("on timer"); reactor.callLater(3000, &test); } reactor.callLater(3000, delegate void(){test();}); reactor.listenTCP(new InternetAddress(port), new ServerFactory!(Echo)); reactor.listenTCP(new InternetAddress(port + 1), new ServerFactory!(DummyLineReceiver)); reactor.run(); } 它做了3件事: 1、监听4444端口(或参数传递进来的端口值),当收到数据时把数据发回并断开连接。 2、监听4445端口,当收到数据时把数据按换行符分割。 3、每3秒调用一下计时器方法。 这些都是在同一个线程中完成的,和twisted调用方式比较相似。 接下来想把epoll加入进来,因为select在phobos中已经包装过一层,现在又用了个关联数组来联系事件处理器,连接比较多时效率肯定不高。 |
|
qiezi
2007-01-12
这里怎么不能上传附件呢?
|
|
qiezi
2007-01-12
我发在共享里了,实现了一个简单的SelectReactor和EpollReactor,EpollReactor要使用-version=Linux来编译,自然也无法在Windows下编译咯。
实现了callLater计时器和listenTCP。欢迎试用、反馈、参与、修改、侮辱。。。 dace-pre-0.1 文件夹的名字是dace,不过里面命名还是dtwisted,暂时没去处理它,以后可能采用dtwisted。 |
|
ideage
2007-01-13
qiezi 写道 欢迎试用、反馈、参与、修改、侮辱。。。
太谦虚了.学习! |
|
qiezi
2007-01-13
所有代码只在linux下测试过。最近想做的事太多了,比如xul,xpcom,特别是xpcom,我想把它移植到D。初略看了一下,它的模型和COM应该是二进制兼容的,如果是这样,使用extern(Windows)来定义接口就可以用D来编写xpcom应用,extern(Windows)是调用约定声明,而不是Windows平台标识,它在linux下是可以编译的。我修改了xpidl的代码,增加了一个idl到D语言的转换器,是从c++版本拷贝修改的。下一步可能是要把所有idl生成一个D版本,然后测试它。接着结合xpcom, xul和dtwisted,做一个小型的im软件,以测试D语言性能和开发模式。
|
|
qiezi
2007-01-13
另外一个奇怪的地方,我只写了epoll的D声明,而没有链接其它库,编译也过了,难道内核函数都不需要另外链接其它库?
|
|
ideage
2007-01-14
qiezi 写道 另外一个奇怪的地方,我只写了epoll的D声明,而没有链接其它库,编译也过了,难道内核函数都不需要另外链接其它库?
你没有编译成执行文件前,不需要链接. |
|
qiezi
2007-01-14
ideage 写道 qiezi 写道 另外一个奇怪的地方,我只写了epoll的D声明,而没有链接其它库,编译也过了,难道内核函数都不需要另外链接其它库?
你没有编译成执行文件前,不需要链接. 我说的编译过了,就是链接成可执行文件。运行测试也正常了。 |
|
cookoo
2007-01-18
厉害厉害,5小时写了个twisted。
epoll阿,erlang内部也用这个的。 |
|
qiezi
2007-01-18
呵呵,只包括网络部分而已。twisted-core部分还包括对文件的抽象,不过说点实话,一样的功能用D实现起来真的比python的代码要少一些,这是始料未及的。
D语言写代码感觉还算顺畅,目前也只有几百行而已。 我加上了connectTCP,有空发上来,google code老是上不了,真是头痛。 callNext这个timer功能实现得不好,我使用了委托,结果D语言中闭包并不是真的闭包,上下文并没有完整拷贝,所以如果在这个委托中使用了当时上下文相关的东西,等到调用时可能已经失效了。或者被GC给处理了(内存整理?),当然合理的情况是GC处理过也应该有效才对,但我测试来看它的确引起了一个段错误,大概与栈有关,看样子要采用twisted和c#的invoke那样的实现了,这真的不是我想要的。。。 我想下一步加上SSL功能,接着该实现几个简单的协议。 再下一步做什么?做个简单的web server?或者是和mango整合一下,高层协议跟它跨接起来。 epoll效率的确会高很多,携带用户数据这一点小改进,作用却非常明显。 erlang的并发模型我真的满向往的,今天又下载了fortress教程,感觉并发这个东西还是必须从语言底层解决掉,不过还是感觉erlang不够友好。fortress不知道怎么评价,看起来真的很漂亮。 dtwisted我还是有所顾虑,并发模型不知道在哪里解决比较好,或者干脆就不管它,让用户自己去处理?但最终总要写一个合适的例子,来说明它对于并发也是支持的。 cookoo最近很少见你呀,在学什么东西分享一下。。 注:上面说的段错误是这么发生的: class TestClientProtocol : Protocol{ private IReactor reactor_; //怎么设这个值就不说明了,是写了一个Factory来完成的,python也使用类似手段 protected void connectionMade(){ reactor_.callLater(3000, delegate void(){transport.write("abc");}); } } 3秒过后,执行这个委托就是段错误了,输出this都不可以,而这个protocol对象是存在的,所以问题应该在于栈上,有空要研究一下函数直接量是如何实现的,才能搞明白这个问题。 |