Tigase改装(一) – 从客户端和服务器的请求应答开始

Tigase改装目标

把Tigase迁移到DAF是我们的目标。DAF(Datou Application Framework)是手机大头的服务器集群应用开发框架,它使用Zeroc ICE作为服务器节点和节点之间的通讯中间件,使用Google Protocol Buffers作为通讯内容格式。


在开始的前几天,思路是模糊的,因为对tigase还有太多不了解,所以日记中的一些结论是基于猜测和经验产生的,很可能在继续深入的时候被推翻。所以各位看官发现有重大问题时不必惊慌,以后我会自己发现的。

可以想像,迁移工作分为以下几个重要部分:

  • XMPP要求entity与entity之间使用xml进行通讯,但DAF要求entity与entity之间使用PB进行通讯。所以在服务端,我们需要把entity和entity(这里的两个entity特指tigase的内部组件或服务)之间的xml通讯修改为pb通讯,或者采用简单一些的方法:干脆不对tigase进行任何拆解,整个一个服务作为DAF中的一个节点。
  • 不管最终方案是否对Tigase进行拆解,都必须对XMPP协议进行转换,转换为大头私有协议,这需要一个协议转换器。
  • 因为大头IM客户端和服务器之间的通讯基于http1.0,所以如果要让老版本客户端兼容,必须借助并修改Tigase 的BOSH实现;或者我们自己为每一个已连接的老客户端实现一个消息栈。
  • 将Tigase的配置框架修改为DAF的配置框架,这个工作应该不难做
  • 将Tigase的启动迁移到DAF的节点启动框架中,这个工作也不难

从上述已想到的工作大项上看,最具挑战性的工作是第一项,工作量无法预估,工作时间更无法预估。

为了顺利得启动第一项工作,首先要了解XMPP协议内容(英文原版和中文翻译版),在阅读中文版的时候发现了一个严重的错误,所以之后开始中英文参照阅读。之后为了实际考察Tigase和XMPP客户端之间的通讯,我使用Pidgin作为XMPP客户端,连接Tigase服务器进行了登录测试。

如何通过日志查看Tigase服务器和Pidgin客户端的通讯日志

Tigase改装(一) – 从客户端和服务器的请求应答开始_第1张图片


添加打印通讯日志代码的最佳位置

打印日志的最佳位置在tigase.net.IOService,IOService中有两个重要方法:


protected void writeData(final String data) {
    // 这个方法里面的代码需要极小调整:
    // 修改前:
    if (data.length() < 256) {
        log.log(Level.FINEST, "Socket: {0}, Writing data ({1}): {2}", new Object[]{socketIO,
                data.length(), data});
    } else {
        log.log(Level.FINEST, "Socket: {0}, Writing data: {1}", new Object[]{socketIO,
                data.length()});
    }
    // 修改后:
    log.log(Level.FINEST, "Socket: {0}, Writing data ({1}): {2}", new Object[]{socketIO,
            data.length(), data});
}
 
protected char[] readData() throws IOException {
    // 这个方法里面的代码需要极小调整,:
    if (log.isLoggable(Level.FINEST)) {
    // 修改前:
    log.log(Level.FINEST,
            "Socket: " + socketIO + ", Decoded character data: " + cb.array().length);
    // 修改后
    log.log(Level.FINEST,
                "Socket: " + socketIO + ", Decoded character data: " + cb.toString());
    }
}

修改完代码之后,再编辑Tigase_Home/etc/init.properties文件:


1、C to S


<?xml version='1.0' ?>
<stream:stream to='chutianxing-laptop' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>



2、S to C



<?xml version='1.0'?>
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='chutianxing-laptop' id='2a64d8bf-b69e-4267-8792-e1e20d6b6ce5' version='1.0' xml:lang='en'>



3、S to C



<stream:features>
<ver xmlns="urn:xmpp:features:rosterver"/>
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"> 
    <mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism>  
    <mechanism>CRAM-MD5</mechanism><mechanism>ANONYMOUS</mechanism>  
  </mechanisms>
  <register xmlns="http://jabber.org/features/iq-register"/>
    <auth xmlns="http://jabber.org/features/iq-auth"/>
</stream:features>

4、C to S

<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>



5、 S to C:

<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>



6、 C to S(encoded ):

<stream:stream to='chutianxing-laptop' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>



。。。。。。。。。。。。。。。。

你可能感兴趣的:(Tigase改装(一) – 从客户端和服务器的请求应答开始)