`
henry2009
  • 浏览: 91168 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ttserver-java改写成tctserver-java(日记)

阅读更多

看了一段时间ttserver的c代码。发现ttserver是根据输入的字符,寻找具体的方法。

数据到达ttserver端以后,就根据传输的代码格式拆包。

要使用tctserver可以修改ttserver-java的protocol包中的方法

 

增加一个叫misc的类,操作ttserver的misc方法。

package tokyotyrant.protocol;

//import org.jboss.netty.buffer.ChannelBuffer;
//
//import tokyotyrant.helper.BufferHelper;
import java.util.ArrayList;
import java.util.List;

import org.jboss.netty.buffer.ChannelBuffer;

import tokyotyrant.transcoder.ByteArrayTranscoder;
import tokyotyrant.transcoder.StringTranscoder;
import tokyotyrant.transcoder.Transcoder;

import com.dindine.ttserver.util.ListUtil;

/**
 * @作用:用方法名,定位缓存数据库使用的
 * @author henry
 * @date 2010-4-2
 */
public class MISC extends CommandSupport<List<String>> {
	
	private static final PacketFormat RESPONSE = code(false).end();
	private final byte[] key;
	private List<String> list;
	private byte[][] rbuf;
	private final int opts;
	private final int rnum;
	private final List<String> conds;
	private static final Transcoder keyTranscoder = new ByteArrayTranscoder();
	private static final Transcoder rbufTranscoder = new ByteArrayTranscoder();
	private static final Transcoder VALUE_TRANSCODER = new StringTranscoder();

	public MISC(String funcName, int opts, List<String> lstr, PacketFormat REQUEST) {
		// TODO Auto-generated constructor stub
		super((byte) 0x90, REQUEST, RESPONSE, keyTranscoder, rbufTranscoder);
		key = ListUtil.strToBytes(funcName);
		this.opts = opts;
		if(lstr == null) {
			rnum = 0;
		} else {
			rnum = lstr.size();
		}
		conds = lstr;
		rbuf = new byte[rnum][];
	}

	@Override
	protected void pack(PacketContext context) {
		// TODO Auto-generated method stub
		context.put("nsiz", key.length);
		context.put("opts", opts);
		context.put("rnum", rnum);
		context.put("name", key);
		for (int i = 0; i < rnum; i++) {
			rbuf[i] = ListUtil.strToBytes(conds.get(i));
			context.put("rsiz"+i, rbuf[i].length);
			context.put("rbuf"+i, rbuf[i]);
		}
		if(conds != null)
			conds.clear();
	}

	@Override
	protected void unpack(PacketContext context) {
		// TODO Auto-generated method stub
		code = (Byte) context.get("code");
	}

	public boolean decode(ChannelBuffer in) {
		if (in.readableBytes() < 1) {
			return false;
		}
		code = in.readByte();
		int rnum = in.readInt();
		list = new ArrayList<String>(rnum);
		for (int i = 0; i < rnum; i++) {
			if(in.readableBytes() < 4) {
				return false;
			}
			
			int len = in.readInt();
			if(in.readableBytes() < len) {
				return false;
			}
			byte[] value = new byte[len];
			in.readBytes(value);
			list.add((String)VALUE_TRANSCODER.decode(value));
		}
		return true;
	}

	@Override
	public List<String> getReturnValue() {
		// TODO Auto-generated method stub
		if (isSuccess()) {
			return list;
		} else {
			return null;
		}
	}

}
 

这段是我的misc的java代码组装格式。

 

在RDB.java中加入如下方法

public Object misc(String funcName, int opts, List<String> conds) {
        PacketFormatBuilder builder = new PacketFormatBuilder();
        builder.magic().int32("nsiz").int32("opts").int32("rnum").bytes("name", "nsiz");
        int len = 0;
        if(conds != null) {
            len = conds.size();
        }
        for (int i = 0; i < len; i++) {
            builder.int32("rsiz" + i);
            builder.bytes("rbuf" + i, "rsiz" + i);
        }
        PacketFormat request = builder.end();
        return execute(new MISC(funcName, opts, conds, request));
}

funcName就是要使用的方法名。

具体传输可以参考php-tyrant或jtokyotyrant类库写法。

分享到:
评论

相关推荐

    ttserver-lib包

    tokyocabinet-1.4.45.tar.gz tokyotyrant-1.1.41.tar.gz tokyotyrant-0.11.jar ch-tokyocabinet-java-1.24.0.jar

    TTServer-Docs:蘑菇街TeamTalk TTServer文档

    TTServer-Docs蘑菇街TeamTalk TTServer文档双击docs-&gt;html-&gt;index.html即可打开

    ttserver

    ttserver tokyocabinet-1.4.27.tar

    TTserver1.1.4

    TTserver1.1.4

    TTserver测试结果

    TTserver测试结果. 测试验证同步效率还是蛮高的。

    memcached和TTserver的使用

    TTServer经过两年左右的发展,目前成为应用很广的NoSQL存储方案。性能好,有复制功能、代码量小,容易吃透,在key-value数据存储领域很有优势。 hash方式结合复制功能,数据安全性较高,运行稳定。 B+ Tree方式...

    ttserver.exe

    主要用于远程协助使用,比QQ远程协助速度更快,更好用一些。 被协助者请运行“ttserver.exe”运行软件之后,随便输入一个验证码,然后点击‘被协助’,并将验证码告知协助方,协助方运行“ttclient.exe”

    https-github.com-mogutt-TTServer

    ###简介: TeamTalk是一套开源的企业办公即时通讯软件,作为整套系统的组成部分之一,TTServer为TeamTalk 客户端提供用户登录,消息转发及存储等基础服务。...DBProxy (JAVA): 数据库代理服务器,提供mysql以及redis的

    TTSERVER V2.1.1

    很方便的远程软件,突破距离的限制。大家帮助大家

    ttserver被协助端.rar

    ttserver被协助端,这个不用介绍了吧,大家都知道

    远程协助软件-TTVNC

    主要用于远程协助使用,比QQ远程协助速度更快,更好用一些。...若被协助方的‘被协助’按钮为灰色,请去掉后面‘自动连接’的勾,然后退出软件重新运行 ttserver.exe 输入验证码并点击被协助即可。

    关于使用key/value数据库redis和TTSERVER的心得体会

    先说redisredis是一个类似memcached的key/value存储系统,它支持存储的value类型相对较多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。在此基础上,redis支持各种不同方式的排序。...

    TTServer:蘑菇街一款既是做开源又是做产品的企业办公即时通信软件

    ###项目背景 随着蘑菇街由导购向电商转型,蘑菇街自己的IM也应运而生,IM起初只是用于商家和 买家之间沟通的工具。后面我们问自己,既然已经有了用于客服的IM,为什么不自己 做一个IM,用于公司内部的沟通工具,来...

    TTMobile:用于通过 TTServer 存储 GPS 轨迹的 Android 应用程序

    TTMobile 用于通过 TTServer 存储 GPS 轨迹的 Android 应用程序

    远程工具ttvnc

    远程工具,才几百K的容量,小巧精致。简单实用,只要填上相同的验证码,点协助或被协助,就能能够远程帮助朋友解决问题

    远程控制软件被控端下载

    被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端被控端

    远程控制软件 ttvnc软件

    你可以用这个软件,来帮助其他人维护电脑等等...

    TeamTalk全套源码

    TeamTalk是一套开源的企业办公即时通讯软件,作为整套系统的组成部分之一,TTServer为TeamTalk 客户端提供用户登录,消息转发及存储等基础服务。 TTServer主要包含了以下几种服务器: LoginServer (C++): 登录服务器...

    ftpserver小工具

    在windows上快速搭建ftp的小工具

Global site tag (gtag.js) - Google Analytics