打算把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对象是存在的,所以问题应该在于栈上,有空要研究一下函数直接量是如何实现的,才能搞明白这个问题。
Global site tag (gtag.js) - Google Analytics