精华内容
下载资源
问答
  • 时空中的绘旅人tt客户端是一款故事有趣的、线路丰富的剧情恋爱游戏。精致的CG画面,各不相同凡人平行时空,完美演绎精彩的剧情故事,在不同的场景世界都有不同的体验,每个世界都值得期待,开启专属于你的绘梦之旅把...

    时空中的绘旅人tt客户端是一款故事有趣的、线路丰富的剧情恋爱游戏。精致的CG画面,各不相同凡人平行时空,完美演绎精彩的剧情故事,在不同的场景世界都有不同的体验,每个世界都值得期待,开启专属于你的绘梦之旅把!

    时空中的绘旅人tt游戏简介

    在游戏中,玩家可以在平行时空之中穿梭自如,有现实世界温馨的校园日常,领教平行世界里的末日危机,每个多元世界都有不同。在平行的时空中,2265玩家会发现原本现实世界中的相似的面孔,在异世界将拥有迥异的性格,游走于这种“精分”人设的感觉相当的有趣。

    时空中的绘旅人tt版角色介绍

    【司岚】

    英文名:Clarence

    配音:谢添天

    现代世界身份:现实世界中,他是心怀公义的学生会长。

    代表台词:我们年少时总有很大的梦想,大到不可能。

    平行世界身份:在叶塞大陆,他是冷漠深沉的首席法师。

    代表台词:这一切因我而始,也将由我终结。

    37dead07b9cfbd18fe310e29beaa9952.png

    【路辰】

    英文名:Alkaid

    配音:赵路

    现代世界身份:在圣塞西尔学院,他是转学而来的天文系学长。

    代表台词:我想定格那些风景,风景里有你。

    平行世界身份:在叶塞大陆,他是法师塔忠诚的守卫者。

    代表台词:你看到星光了吗?如此美丽,但它们是死去的光。

    【罗夏】

    英文名:Rorschach

    配音:夏磊

    现代世界身份:现实世界中,他是飞扬跳脱、不按常理出牌的总裁。

    代表台词 :若生活一成不变,我大概无法忍受哪怕一天。

    平行世界身份:在叶塞大陆,他是独断强势的皇帝。

    代表台词:你不可能用温柔和理性战胜寒冬,得用剑与火。 

    【艾因】

    英文名:Ayn

    配音:阿杰

    现代世界身份:在圣塞西尔学院,他是安静的音乐少年。

    代表台词:世界就是一场演奏会,有人表述,有人倾听。

    平行世界身份:在叶塞大陆,他是一心复仇的王子。

    代表台词:我会夺回我所失去的一切……不管要付出怎样代价,有谁阻拦。 

    【叶瑄】

    英文名:Emerald

    配音:姜广涛

    现代世界身份:现实世界中,他是优雅温柔的美术系导师。

    代表台词:你会在璀璨光芒中,找到前行之路。

    平行世界身份:在叶塞大陆,他是对贫富贵贱都一视同仁、引导大家的白银骑士。

    e21139be40d0da9f30167ce82f47f604.png

    游戏评测

    ·我很难想象一款乙女向游戏能带给我如此惊艳的感觉,或许是细节上处理的到位、美术风格拿捏的恰到好处,才让《时空中的绘旅人》成为一款男女通吃的作品。

    ·虽然还是测试期间,游戏的内容还没有完全实装,但其潜力从现有内容中可见一斑。如果你是个喜欢乙女游戏的玩家,那么游戏的高质量一定能让你满意;如果你只是想听一个精彩的故事,这款游戏同样能满足你。

    ·在我看来,《绘旅人》代表了网易在叙事表达上的野心。这款游戏的品质高吗?确实高。但它并没高到像《一梦江湖》(原名楚留香)刚推出时,抬高MMO品类门槛的高度。叙事才是它最大的核心竞争力。网易曾经吃到过叙事的红利。《阴阳师》刚刚上线的时候,大家讨论的除了美术和SSR,还有它扎实的剧情。而如今《绘旅人》又进了一步,它试图探索一套更创新的叙事表达框架,以及更复杂的角色塑造形式。这在游戏领域十分罕见。

    展开全文
  • 这里开放的是客户端主要功能代码,开源的目的一方面是希望更多的人来学习研究TC和TT,同时大家可以下载本C#源码继续优化提升性能,同时查找BUG,必定本人精力能力有限,而Discuz!NT企业版的功能点又太多(抽空会多写...
  • 转---ftp客户端

    2010-06-10 17:19:00
    利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能 1.支持上传下载。支持断点续传 2.支持进度汇报 3.支持对于中文目录及中文文件创建的支持。 importjava.io.File;...

    http://www.cnblogs.com/tt_mc/archive/2010/03/22/1691708.html

    利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能

    1.支持上传下载。支持断点续传

    2.支持进度汇报

    3.支持对于中文目录及中文文件创建的支持。

    importjava.io.File;
    importjava.io.FileOutputStream;
    importjava.io.IOException;
    importjava.io.InputStream;
    importjava.io.OutputStream;
    importjava.io.PrintWriter;
    importjava.io.RandomAccessFile;

    importopen.mis.data.DownloadStatus;
    importopen.mis.data.UploadStatus;

    importorg.apache.commons.net.PrintCommandListener;
    importorg.apache.commons.net.ftp.FTP;
    importorg.apache.commons.net.ftp.FTPClient;
    importorg.apache.commons.net.ftp.FTPFile;
    importorg.apache.commons.net.ftp.FTPReply;

    /***//**
    *支持断点续传的FTP实用类
    *
    @authorBenZhouhttp://www.bt285.cn
    *
    @version0.1实现基本断点上传下载
    *
    @version0.2实现上传下载进度汇报
    *
    @version0.3实现中文目录创建及中文文件创建,添加对于中文的支持
    */
    publicclassContinueFTP{
    publicFTPClientftpClient=newFTPClient();

    publicContinueFTP(){
    //设置将过程中使用到的命令输出到控制台
    this.ftpClient.addProtocolCommandListener(newPrintCommandListener(newPrintWriter(System.out)));
    }

    /***//**
    *连接到FTP服务器
    *
    @paramhostname主机名
    *
    @paramport端口
    *
    @paramusername用户名
    *
    @parampassword密码
    *
    @return是否连接成功
    *
    @throwsIOException
    */
    publicbooleanconnect(Stringhostname,intport,Stringusername,Stringpassword)throwsIOException{
    ftpClient.connect(hostname,port);
    ftpClient.setControlEncoding(
    "GBK");
    if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){
    if(ftpClient.login(username,password)){
    returntrue;
    }
    }
    disconnect();
    returnfalse;
    }

    /***//**
    *从FTP服务器上下载文件,支持断点续传,上传百分比汇报
    *
    @paramremote远程文件路径
    *
    @paramlocal本地文件路径
    *
    @return上传的状态
    *
    @throwsIOException
    */
    publicDownloadStatusdownload(Stringremote,Stringlocal)throwsIOException{
    //设置被动模式
    ftpClient.enterLocalPassiveMode();
    //设置以二进制方式传输
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    DownloadStatusresult;

    //检查远程文件是否存在
    FTPFile[]files=ftpClient.listFiles(newString(remote.getBytes("GBK"),"iso-8859-1"));
    if(files.length!=1){
    System.out.println(
    "远程文件不存在");
    returnDownloadStatus.Remote_File_Noexist;
    }

    longlRemoteSize=files[0].getSize();
    Filef
    =newFile(local);
    //本地存在文件,进行断点下载
    if(f.exists()){
    longlocalSize=f.length();
    //判断本地文件大小是否大于远程文件大小
    if(localSize>=lRemoteSize){
    System.out.println(
    "本地文件大于远程文件,下载中止");
    returnDownloadStatus.Local_Bigger_Remote;
    }

    //进行断点续传,并记录状态
    FileOutputStreamout=newFileOutputStream(f,true);
    ftpClient.setRestartOffset(localSize);
    InputStreamin
    =ftpClient.retrieveFileStream(newString(remote.getBytes("GBK"),"iso-8859-1"));
    byte[]bytes=newbyte[1024];
    longstep=lRemoteSize/100;
    longprocess=localSize/step;
    intc;
    while((c=in.read(bytes))!=-1){
    out.write(bytes,
    0,c);
    localSize
    +=c;
    longnowProcess=localSize/step;
    if(nowProcess>process){
    process
    =nowProcess;
    if(process%10==0)
    System.out.println(
    "下载进度:"+process);
    //TODO更新文件下载进度,值存放在process变量中
    }
    }
    in.close();
    out.close();
    booleanisDo=ftpClient.completePendingCommand();
    if(isDo){
    result
    =DownloadStatus.Download_From_Break_Success;
    }
    else{
    result
    =DownloadStatus.Download_From_Break_Failed;
    }
    }
    else{
    OutputStreamout
    =newFileOutputStream(f);
    InputStreamin
    =ftpClient.retrieveFileStream(newString(remote.getBytes("GBK"),"iso-8859-1"));
    byte[]bytes=newbyte[1024];
    longstep=lRemoteSize/100;
    longprocess=0;
    longlocalSize=0L;
    intc;
    while((c=in.read(bytes))!=-1){
    out.write(bytes,
    0,c);
    localSize
    +=c;
    longnowProcess=localSize/step;
    if(nowProcess>process){
    process
    =nowProcess;
    if(process%10==0)
    System.out.println(
    "下载进度:"+process);
    //TODO更新文件下载进度,值存放在process变量中
    }
    }
    in.close();
    out.close();
    booleanupNewStatus=ftpClient.completePendingCommand();
    if(upNewStatus){
    result
    =DownloadStatus.Download_New_Success;
    }
    else{
    result
    =DownloadStatus.Download_New_Failed;
    }
    }
    returnresult;
    }

    /***//**
    *上传文件到FTP服务器,支持断点续传
    *
    @paramlocal本地文件名称,绝对路径
    *
    @paramremote远程文件路径,使用/home/directory1/subdirectory/file.ext或是http://www.guihua.org/subdirectory/file.ext按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构
    *
    @return上传结果
    *
    @throwsIOException
    */
    publicUploadStatusupload(Stringlocal,Stringremote)throwsIOException{
    //设置PassiveMode传输
    ftpClient.enterLocalPassiveMode();
    //设置以二进制流的方式传输
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    ftpClient.setControlEncoding(
    "GBK");
    UploadStatusresult;
    //对远程目录的处理
    StringremoteFileName=remote;
    if(remote.contains("/")){
    remoteFileName
    =remote.substring(remote.lastIndexOf("/")+1);
    //创建服务器远程目录结构,创建失败直接返回
    if(CreateDirecroty(remote,ftpClient)==UploadStatus.Create_Directory_Fail){
    returnUploadStatus.Create_Directory_Fail;
    }
    }

    //检查远程是否存在文件
    FTPFile[]files=ftpClient.listFiles(newString(remoteFileName.getBytes("GBK"),"iso-8859-1"));
    if(files.length==1){
    longremoteSize=files[0].getSize();
    Filef
    =newFile(local);
    longlocalSize=f.length();
    if(remoteSize==localSize){
    returnUploadStatus.File_Exits;
    }
    elseif(remoteSize>localSize){
    returnUploadStatus.Remote_Bigger_Local;
    }

    //尝试移动文件内读取指针,实现断点续传
    result=uploadFile(remoteFileName,f,ftpClient,remoteSize);

    //如果断点续传没有成功,则删除服务器上文件,重新上传
    if(result==UploadStatus.Upload_From_Break_Failed){
    if(!ftpClient.deleteFile(remoteFileName)){
    returnUploadStatus.Delete_Remote_Faild;
    }
    result
    =uploadFile(remoteFileName,f,ftpClient,0);
    }
    }
    else{
    result
    =uploadFile(remoteFileName,newFile(local),ftpClient,0);
    }
    returnresult;
    }
    /***//**
    *断开与远程服务器的连接
    *
    @throwsIOException
    */
    publicvoiddisconnect()throwsIOException{
    if(ftpClient.isConnected()){
    ftpClient.disconnect();
    }
    }

    /***//**
    *递归创建远程服务器目录
    *
    @paramremote远程服务器文件绝对路径
    *
    @paramftpClientFTPClient对象
    *
    @return目录创建是否成功
    *
    @throwsIOException
    */
    publicUploadStatusCreateDirecroty(Stringremote,FTPClientftpClient)throwsIOException{
    UploadStatusstatus
    =UploadStatus.Create_Directory_Success;
    Stringdirectory
    =remote.substring(0,remote.lastIndexOf("/")+1);
    if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(newString(directory.getBytes("GBK"),"iso-8859-1"))){
    //如果远程目录不存在,则递归创建远程服务器目录
    intstart=0;
    intend=0;
    if(directory.startsWith("/")){
    start
    =1;
    }
    else{
    start
    =0;
    }
    end
    =directory.indexOf("/",start);
    while(true){
    StringsubDirectory
    =newString(remote.substring(start,end).getBytes("GBK"),"iso-8859-1");
    if(!ftpClient.changeWorkingDirectory(subDirectory)){
    if(ftpClient.makeDirectory(subDirectory)){
    ftpClient.changeWorkingDirectory(subDirectory);
    }
    else{
    System.out.println(
    "创建目录失败");
    returnUploadStatus.Create_Directory_Fail;
    }
    }

    start
    =end+1;
    end
    =directory.indexOf("/",start);

    //检查所有目录是否创建完毕
    if(end<=start){
    break;
    }
    }
    }
    returnstatus;
    }

    /***//**
    *上传文件到服务器,新上传和断点续传
    *
    @paramremoteFile远程文件名,在上传之前已经将服务器工作目录做了改变
    *
    @paramlocalFile本地文件File句柄,绝对路径
    *
    @paramprocessStep需要显示的处理进度步进值
    *
    @paramftpClientFTPClient引用
    *
    @return
    *
    @throwsIOException
    */
    publicUploadStatusuploadFile(StringremoteFile,FilelocalFile,FTPClientftpClient,longremoteSize)throwsIOException{
    UploadStatusstatus;
    //显示进度的上传
    longstep=localFile.length()/100;
    longprocess=0;
    longlocalreadbytes=0L;
    RandomAccessFileraf
    =newRandomAccessFile(localFile,"r");
    OutputStreamout
    =ftpClient.appendFileStream(newString(remoteFile.getBytes("GBK"),"iso-8859-1"));
    //断点续传
    if(remoteSize>0){
    ftpClient.setRestartOffset(remoteSize);
    process
    =remoteSize/step;
    raf.seek(remoteSize);
    localreadbytes
    =remoteSize;
    }
    byte[]bytes=newbyte[1024];
    intc;
    while((c=raf.read(bytes))!=-1){
    out.write(bytes,
    0,c);
    localreadbytes
    +=c;
    if(localreadbytes/step!=process){
    process
    =localreadbytes/step;
    System.out.println(
    "上传进度:"+process);
    //TODO汇报上传状态
    }
    }
    out.flush();
    raf.close();
    out.close();
    booleanresult=ftpClient.completePendingCommand();
    if(remoteSize>0){
    status
    =result?UploadStatus.Upload_From_Break_Success:UploadStatus.Upload_From_Break_Failed;
    }
    else{
    status
    =result?UploadStatus.Upload_New_File_Success:UploadStatus.Upload_New_File_Failed;
    }
    returnstatus;
    }

    publicstaticvoidmain(String[]args){
    ContinueFTPmyFtp
    =newContinueFTP();
    try{
    myFtp.connect(
    "192.168.21.181",21,"nid","123");
    //myFtp.ftpClient.makeDirectory(newString("电视剧".getBytes("GBK"),"iso-8859-1"));
    //myFtp.ftpClient.changeWorkingDirectory(newString("电视剧".getBytes("GBK"),"iso-8859-1"));
    //myFtp.ftpClient.makeDirectory(newString("走西口".getBytes("GBK"),"iso-8859-1"));
    //System.out.println(myFtp.upload("http://www.5a520.cn/yw.flv","/yw.flv",5));
    //System.out.println(myFtp.upload("http://www.5a520.cn/走西口24.mp4","/央视走西口/新浪网/走西口24.mp4"));
    System.out.println(myFtp.download("/央视走西口/新浪网/走西口24.mp4","E://走西口242.mp4"));
    myFtp.disconnect();
    }
    catch(IOExceptione){
    System.out.println(
    "连接FTP出错:"+e.getMessage());
    }
    }
    }

    展开全文
  • 目前在网上关于TokyoCabinet(以下简称TC)和TokyoTyrant(以下简称TT)的资料... 这里开放的是客户端主要功能代码,开源的目的一方面是希望更多的人来学习研究TC和TT,同时大家可以下载本C#源码继续优化提升性能,...

           目前在网上关于TokyoCabinet(以下简称TC)和TokyoTyrant(以下简称TT)的资料已相对丰富了,但在.NET平台上的客户端软件却相对匮乏,因为做Discuz!NT企业版的关系,两个月前开始接触TC和TT,开始写相关的客户端代码。
          这里开放的是客户端主要功能代码,开源的目的一方面是希望更多的人来学习研究TC和TT,同时大家可以下载本C#源码继续优化提升性能,同时查找BUG,必定本人精力能力有限,而Discuz!NT企业版的功能点又太多(抽空会多写文章进行介绍)实在有些力不从心了,呵呵:)

           好了,为了便于使用,下面先对源码中的项目文件进行说明:
     
          源码包中包括三个项目:
          1.Discuz.EntLib.TokyoTyrant 核心功能代码(目前名空间暂以产品命名)
          2.TTSample 主要用于加载测试数据,并对比SQLSERVER数据库的创建查询功能的速度。
          3.TTSampleConsole 使用核心功能代码的例子(本文中会介绍其中主要功能)

     

           其中Discuz.EntLib.TokyoTyrant中类图如下:

        
      
    该客户端有如下特点:     

    • 支持TcpClient连接池
    • 支持UTF-8编码
    • 支持初始化链接数,链接过期时间,最大空闲时间,最长工作时间等设置

    下面介绍一下如何使用

      1.初始化链接池:

    ExpandedBlockStart.gif
                pool = TcpClientIOPool.GetInstance("dnt_online");//链接池名称(即DNT在线表)
                pool.SetServers(new string[] { "10.0.4.66:11211"});
                pool.InitConnections 
    = 8;
                pool.MinConnections 
    = 8;
                pool.MaxConnections 
    = 8;
                pool.MaxIdle 
    = 30000;
                pool.MaxBusy 
    = 50000;
                pool.MaintenanceSleep 
    = 300000;
                pool.TcpClientTimeout 
    = 3000;
                pool.TcpClientConnectTimeout 
    = 30000;
                pool.Initialize();

     

     

        2.CRUD操作

    创建一条记录(以DISCUZ!NT在线表字段为例):  

    ExpandedBlockStart.gif
    IDictionary<stringstring> columns = new System.Collections.Generic.Dictionary<stringstring>();
                    columns.Add(
    "olid", i.ToString());
                    columns.Add(
    "userid", i.ToString());
                    columns.Add(
    "ip""10.0.7." + i);
                    columns.Add(
    "username""用户" + i);
                    columns.Add(
    "nickname""用户" + i);
                    columns.Add(
    "password""");
                    columns.Add(
    "groupid""5");
                    columns.Add(
    "olimg""");
                    columns.Add(
    "adminid""0");
                    columns.Add(
    "invisible""0");
                    columns.Add(
    "action""0");
                    columns.Add(
    "lastactivity""1");
                    columns.Add(
    "lastposttime", DateTime.Now.ToString());
                    columns.Add(
    "lastpostpmtime", DateTime.Now.ToString());
                    columns.Add(
    "lastsearchtime", DateTime.Now.ToString());
                    columns.Add(
    "lastupdatetime", DateTime.Now.ToString());
                    columns.Add(
    "forumid""0");
                    columns.Add(
    "forumname""");
                    columns.Add(
    "titleid""0");
                    columns.Add(
    "title""");
                    columns.Add(
    "verifycode""");
                    columns.Add(
    "newpms""0");
                    columns.Add(
    "newnotices""0");
        TokyoTyrantService.PutColumns(TTPool.GetInstance(), i.ToString(), columns, 
    true);//true表示如tc中有记录则覆盖,没有则创建该记录

     

     

    • 查询操作:  

             首先构程过一个查询(条件)对象,比如查询字段olid = 1的在线用户信息,则该对象定义如下:

    new Query().NumberEquals("olid"1)

      

            然后将其放入TokyoTyrantService的QueryRecords方法中(注意绑定链接池),如下: 

    ExpandedBlockStart.gif
    var qrecords = TokyoTyrantService.QueryRecords(TTPool.GetInstance(), new Query().NumberEquals("olid"1));
    //遍历当前结果集
    foreach (var k in qrecords.Keys)
    {
        var column 
    = qrecords[k];
      ...数据绑定操作    
    }

      

            更复杂的查询,如下(查询forumid = 16 and userid<1000 ,同时按userid字段倒序排列的前三条记录):

    ExpandedBlockStart.gif
     qrecords = TokyoTyrantService.QueryRecords(pool, new Query().NumberGreaterThanOrEqual("forumid"16).
                      NumberLessThan(
    "userid"1000).OrderBy("userid", QueryOrder.NUMDESC).LimitTo(30));

           
            这里的比较运行符可以参见源码中的枚举类型,如下:

    ExpandedBlockStart.gif
    public enum QueryOperation
    {
     STREQ 
    = 0// # 查询条件: 表示与操作对象的文字内容完全相同(=)
     STRINC = 1// # 查询条件: 表示含有操作对象文字的内容(LIKE ‘%文字%’)
     STRBW = 2// # 查询条件: 表示以操作对象的文字行列开始(LIKE ‘文字%’)
     STREW = 3// # 查询条件: 表示到操作对象的文字行列结束(LIKE ‘%文字’)
     STRAND = 4// # 查询条件: 表示包含操作对象的文字行列中右逗号分开部分的字段的全部(name LIKE ‘%文字㈠%’ AND name LIKE ‘%文字㈡%’)
     STROR = 5// # 查询条件: 表示包含操作对象文字段中逗号分开部分的其中一部分(name LIKE ‘%文字㈠%’ OR name LIKE ‘%文字㈡%’)
     STROREQ = 6// # 查询条件: 表示与操作对象文字段中逗号分开部分的其中某部分完全相同( name = ‘文字㈠’ OR name =‘文字㈡’)
     STRRX = 7// # 查询条件: 表与与常规表达式匹配
     NUMEQ = 8// # 查询条件: 表示等于操作对象的数值(=)
     NUMGT = 9// # 查询条件: 表示比操作对象的数值要大(>)
     NUMGE = 10// # 查询条件: 表大于或等于操作对象的数值(>=)
     NUMLT = 11// # 查询条件: 表示比操作对象的数值要小(<)
     NUMLE = 12// # 查询条件: 表示小于或等于操作对象的数值(<=)
     NUMBT = 13// # 查询条件: 表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between 100 and 200)
     NUMOREQ = 14// # 查询条件: 表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between 100 and 200)
     NEGATE = 1 << 24// # 查询条件: 负标志negation flag
     NOIDX = 1 << 25 // # 查询条件: 非索引标志
    }

        
           查询指定主键(如本例中的olid,效率最高) 

    var qrecords = TokyoTyrantService.GetColumns(pool, new string[]{"1""2""3"});
    foreach (string key in qrecords.Keys)
    {
        var column 
    = qrecords[key];           
    }

           

    • 更新操作:
            因为TC的TCT结构没有提供直接更新记录中某一字段的功能,所以只能全部取出相关记录的所有字段,然后再更新全部字段(这种做法的效率不高,但在MONGODB中是可以更新部分字段)。所以要组合使用查询和创建操作中的语法,即选查出相应记录,然后再使用PutColumns方法更新该记录,形式如下:
      ExpandedBlockStart.gif 
      var qrecords = TokyoTyrantService.QueryRecords(TTPool.GetInstance(), new Query().NumberEquals("olid"1));
      foreach (var k in qrecords.Keys)
      {
          var column 
      = qrecords[k];
        ...数据绑定操作 
        TokyoTyrantService.PutColumns(TTPool.GetInstance(), column[
      "olid"], columns, true);//column["olid"]为主键,类似数据库里的主键,以其为查询条件,速度最快   
      }

        

    • 删除操作

               该操作有两种执行方法,一种是选查询出符合条件的记录,然后再删除(依次删除),一种是直接给定要删除的主键直接删除(效率比前者高)。第一种(可以针对不用字段进行查询,并将相应结果的主键做了删除依据)

    ExpandedBlockStart.gif
       var qrecords = TokyoTyrantService.QueryRecords(TTPool.GetInstance(), new Query().NumberEquals("userid"1));
             
    foreach (var k in qrecords.Keys)
             {
                 var column 
    = qrecords[k];
                  ...数据绑定操作 
                 TokyoTyrantService.Delete(TTPool.GetInstance(), column[
    "olid"]);//column["olid"]为主键,类似数据库里的主键   
             }

     

     
              第二种(删除olid为1或2或3或4的键值记录,只能删除以主键为条件的记录):   

    TokyoTyrantService.DeleteMultiple(pool, new string[] { "1""2""3""4" });

      

    • 创建索引

        TC中支持几种类型的字段索引如下(经常用的是数值型和字符型):   

    ExpandedBlockStart.gif
        /// <summary>
        
    /// 索引类型
        
    /// </summary>
        public enum IndexOption : int
        {
            LEXICAL 
    = 0// # 文本型索引
            DECIMAL = 1// # 数值型索引
            TOKEN = 2// # 标记倒排索引.   
            QGRAM = 3// #QGram倒排索引.
            OPT = 9998// # 9998, 对索引优化
            VOID = 9999// # 9999, 移除索引.
            KEEP = 1 << 24 // # 16777216, 保持已有索引.  
        }

     

     

            比如在线表中经常用的字段索引设置如下: 

    ExpandedBlockStart.gif
        TokyoTyrantService.SetIndex(pool, "olid", IndexOption.DECIMAL);
        TokyoTyrantService.SetIndex(pool, 
    "userid", IndexOption.DECIMAL);
        TokyoTyrantService.SetIndex(pool, 
    "password", IndexOption.LEXICAL);
        TokyoTyrantService.SetIndex(pool, 
    "ip", IndexOption.LEXICAL);
        TokyoTyrantService.SetIndex(pool, 
    "forumid", IndexOption.DECIMAL);
        TokyoTyrantService.SetIndex(pool, 
    "lastupdatetime", IndexOption.DECIMAL); 

     

     
       3.其它常用操作 


    ExpandedBlockStart.gif
     LimitTo(int max, int skip):类似于MYSQL中的LIMIT方法,其中max如同mssql中的TOP,而skip则表示跳过多少条记录(类似LINQ中的那个Skip方法)
     Vanish(TcpClientIOPool pool);清空所有记录
     QueryRecordsCount(TcpClientIOPool pool, Query query)//查询指定条件的记录数
     GetRecordCount(TcpClientIOPool pool)//返回当前表中的记录总数
     GetDatabaseSize(TcpClientIOPool pool);//获取数据库(表)信息
     IteratorNext(TcpClientIOPool pool)//一个迭代器,用于遍历所有记录

     

      

        4.因为其兼容Memcached,所以提供方法支持(键/值对)

    ExpandedBlockStart.gif
      Put(TcpClientIOPool pool, string key, string value, bool overwrite)//该操作方法将不像Put那样获取服务器端返回的信息
      PutFast(TcpClientIOPool pool, string key, string value)//快速存储键值对(不再获取服务端返回信息). 如键值已存在则将被覆盖
      PutMultiple(TcpClientIOPool pool, IDictionary
    <string, string> items) //一次添加多值

      Delete(TcpClientIOPool pool, string key)//删除指定键的记录
      DeleteMultiple(TcpClientIOPool pool, string[] keys)//删除指定键组的记录

      Get(TcpClientIOPool pool, string key)//获取指定键的记录(单条)
      GetSize(TcpClientIOPool pool, string key)//获取指定键的大小
      GetColumns(TcpClientIOPool pool, string[] keys)//获取指定键组的记录(多条)

       

       5.排序
       ExpandedBlockStart.gif

    public enum QueryOrder
    {
           STRASC 
    = 0// # 排序类型: 表示按照文本型字段内的文本内容在字典中排列顺序的升序
            STRDESC = 1// # 排序类型: 表示按照文本型字段内的文本内容在字典中排列顺序的降序
            NUMASC = 2// # 排序类型: 表示按照数值大小的升序
            NUMDESC = 3 // # 排序类型: 表示按照数值大小的降序
    }

      

           用法(如降序并取前16条记录):

    qrecords = TokyoTyrantService.QueryRecords(pool, new Query().OrderBy("userid", QueryOrder.NUMDESC).LimitTo(160));

           注意尽量避免对大数据集(如100w条记录)进行排序,那样耗时会很严重。所以尽量在OrderBy之前指定查询条件,从而缩减查询结果集的尺寸

     

    其它说明:

           TT的启动参数(这里以TCT类型为例):

           注:网上有一些关于TC+TT与MONGODB,Redis的速度测试,所以这里我想有必要对TT的启动参数做一下介绍,因为这会关系到最终的测试结果。
     
            因为两者都使用了MMAP模式,而TC+TT要使用MMAP,就要使用下面参数:

        xmsiz:指定了TCHDB的扩展MMAP内存大小,默认值为 67108864,也就是64M,如果数据库文件超过64M,则只有前部分会映射在内存中,所以写入性能会下降。
        bnum: 指定了bucket array的数量。推荐设置bnum为预计存储总记录数的0.5~4倍,使key的哈希分布更均匀,减少在 bucket内二分查找的时间复杂度。

            

           比如有100w条记录,这里可以使用下面命令行启动ttserver:ExpandedBlockStart.gif 

     ttserver -host 10.0.4.66 -port 11211 -thnum 1024 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 256m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tct#bnum=1000000#rcnum=1000000#xmsiz=1073741824   (注:1073741824=1G)

     

             当然TTServer中针对不同的数据库(TC中支持6种),都有相应的参数进行启动配置(有重复),这会导致的查询和插入数据的结果上有很大的差异,更多的内容可以参见这个链接
     

            下面我将自己对TC+TT(仅使用TCT文件类型,其它5种类型都比这个类型快许多)与MONGODB的测试结果做一下说明:
            机器是一个普遍台式机:1.5g内存+1.5gCPU,64位的centos机器,150g硬盘。

     

         mongodb (centos 64bit) :
        插入1000000 条记录,耗时:250377毫秒 
        对1000000条记录,查询10000 次记录,耗时:8100毫秒 (偶尔出现7500毫秒)  (查询"_id"主键速度在6995毫秒上下)
        对1000000条记录,查询100000 次记录,耗时:77101毫秒   

     

        ttcache(centos 64bit,使用上面的启动参数):
        创建 1000000 条数据,耗时 589472毫秒
        对1000000条记录,查询 10000 次数据,耗时 4843毫秒
        对1000000条记录,查询 100000 次数据,耗时 47903毫秒

     

        注:查询条件动态变化,以模拟实际生产环境。
        比较发现MONGODB插入速度要比TTCACHE快至少一倍(MONGODB在WINDOWS下也是如此),但10000次查询速度会慢大约40%-50%。这里的查询和插入操作都是每做一次操作就Connect一次服务器,操作结束时则将当前链接放到链接池中,而不是开启一个长链接来做批量操作。其中TTSERVER所使用的客户端分别是本文的这个工具, MONGODB则使用的是MongoDB.Driver。
     
        下面是MSSQL数据库操作结果:
        批量创建 1000000 条数据,耗时 9020196毫秒
        批量查询 10000 条数据,耗时 106040毫秒
        批量查询 100000 条数据,耗时 773867毫秒
     
     
          我想进行这类测试,还是不要使用什么WINDOWS(尽量MONGODB在WINDOW下插入数据的速度已很快)或其它操作系统。而应该使用LINUX(尽量是64位)。当然内存要尽量的大,因为尽管TC+TT已很省内存(必定符合日本的国情,资源少还要多办事),但如果要提升查询和插入速度,还是建议4g以上的内存做测
    试。而MONGODB本来对内存要求很高(包括CPU)。


          因为mongodb的插入速度非常快,且在数据库大量可以新建文件来存储新的数据(不像TCT使用一个数据文件),所以在更大级别的数据量插入上依然性能稳定。看来将它视为海量数据存储的分布解决方案还是很有可行性的。当然我目前正在考虑一个架构,就是将MongoDb和TC/TT组合起来,实现读写分离(即将TC作为读数据库slavedb,并发性和查询速度快),而将MongoDb作为写数据库masterdb(更新和插入速度快)。将分布式的MongoDb数据文件与前端TC中的文件依次对应(使用C#代码实现两者之间的数据同步和逻辑调用),这样融合两者各自的优势的结果。当然目前这只是想法,且离文本的内容越来越远了,呵呵。

     

           好了,今天的内容就选到这里了。

     

           下载链接:http://tokyotyrantclient.codeplex.com/


     

    转载于:https://www.cnblogs.com/daizhj/archive/2010/06/08/tokyotyrantclient.html

    展开全文
  • 如您是安卓混服(小七、TT、果盘、4399)平台、偶玩专服版本的用户,请在原平台下载4.1.4版本号的安装包,登录时按相应步骤提示找回即可,如平台尚未上架新包,请耐心等候,后续会进行上架;2.如您是安卓混服(OPPO、...

    小伙伴们看过来!!!

    FuKe君整理了一批FAQ

    一些关注较多问题的答疑

    快来康康吧(^-^)

    e8d4bc78fbd7828d3400f2313d085db6.gif

    复刻最新公告说明

    最新找回平台如下:

    1.如您是安卓混服(小七、TT、果盘、4399)平台、偶玩专服版本的用户,请在原平台下载4.1.4版本号的安装包,登录时按相应步骤提示找回即可,如平台尚未上架新包,请耐心等候,后续会进行上架;

    2.如您是安卓混服(OPPO、VIVO、魅族、360、游戏fan、UC九游小米)平台,AppStore版本,应用宝专服版本的用户,将在后续开启找回,请留意公众号最新动态,玩家可继续使用旧包进行游戏。

    3.如您是安卓混服其他平台的用户,请在微信公众号下载-安卓混服官方包,登录时按相应步骤提示找回即可。

    关于活动福利&补偿等问题:

    小伙伴们关注比较多的「活动福利以及补偿问题,由于目前我们在进行用户找回等操作,等处理完毕后即发放丰厚的全服补偿!并且目前官方正在筹备5周年庆典的活动事宜,后续将会给大家带来一大波超级精彩的活动,小伙伴们可以持续关注下我们,有惊喜哟。

    d01bdf9976a8b31449023de80e01b7bd.png

    关于目前角色找回一些问题的解答

    针对较为集中的一些问题,先给大家做一些解答:

    目前我们开放了部分渠道的角色找回功能,大部分玩家都成功找回角色,但有一部分玩家在角色找回的过程遇到一些问题,如找不到自己的角色、角色提示被别人找回、角色提示被冻结中、寻找客服处理排队很久等等问题。对此给大家带来的不便我们表示深深的歉意。针对目前出现的问题,我们正在极力优化角色找回功能,并增加客服人手,安排24小时值班,请大家不用担心,所有的问题都会得到解决。

    01角色找回过程中,没有发现我的角色?我的角色丢失了吗?
    • 角色是不会丢失的,如同个账号下存在多个角色时,可能只会显示部分角色,玩家只需要核对该角色是自己账号下的角色,即可以进行绑定。如果仍未发现自己的角色,则需要确认角色是否绑定了手机,部分玩家存在同个账号下多个角色绑定不同的手机,需要尝试不同的手机号进行找回。

    • 如尝试之后仍找不到,玩家也不要担心,联系客服人员,提供一些可证明自己持有该角色或账号的截图,如找回界面的全屏截图或付费记录等等。我们的数据库同时记录和保存多样信息,这些信息通过玩家的配合,完全可以协助找回属于自己的角色。

    02角色找回的时候出现一些不属于自己的角色时,该怎么处理呢?

    这种情况一般出现在玩家共享账号的情况,请玩家核对角色信息,绑定属于自己的账号,请勿绑定他人账号,以免给自己和玩家朋友带来不必要的麻烦。

    03角色提示已经被他人找回?角色提示被其他人申请冻结的时候怎么办?
    • 提示角色已经被他人找回,如果玩家可确认该角色是自己角色,则可以申请临时冻结角色。冻结后该角色及其账号下其他角色都无法登录游戏,玩家可联系客服进行角色申诉,需要提供一些信息进行证明,包含充值记录,申请冻结界面截图等等信息。官方人员在进行辨识后,最终会协助玩家找回属于自己的角色。角色提示被他人申请冻结时,使用同上的办法联系客服人员提供相应证明。

    • 另外需要提醒一点,存在共享账号时,玩家可以自行与知道自己账号的玩家事前进行沟通,以免操作错误导致角色被冻结。

    04我的平台还未开始找回,我可以提前做好哪些准备以免出现异常问题?

    确认自己的账号下角色是否都已经绑定过手机。如交易获得的账号,高级角色已经被绑定过手机,可以去其他服创建10级角色重新登录后可以对该角色进行手机验证。按照登录前公告做好截图准备,并保存账号交易截图,近期充值记录。如账号共享,多人知道自己账号则提前同其他人进行沟通,提醒他人进行找回角色操作时,切勿绑错角色。近期不要购买账号,以免被他人恶意找回。

    05持有很多账号,角色找回很多角色没有显示,无法找回怎么办?
    • 我们对单个设备可显示找回角色数量有限制,如果存在很多账号,则无法全部通过自主找回,需要联系客服人员协助处理;

    • 建议该部分玩家,优先找回主号角色,其他小号角色如无法找回则暂时不要进行找回,因为当前反馈玩家较多,此类玩家的问题不会进行优先处理。建议2-3天后再咨询客服进行处理。

    角色冻结找回邮箱服务

    1.关于因角色找回中,角色被冻结需要进行申诉处理的客服邮箱:wanjiafuwu@yoyodao.cn

    2.平台:混服/专服

    区服信息:

    训练家编号:(如果已经被冻结,无法提供,可以不填写)

    联系QQ号:(处理结果会通过QQ告知)

    联系手机号:(尽量填写游戏内用于绑定角色的手机号)

    3.问题描述:(回答以下问题)

    1)账号是否是本人创建?还是交易购买得来?还是别人送号?

    2)是否共享账号?

    4.游戏冻结全屏截图:(此处会包含找回编号,当前客户端渠道)

    点击训练家头像后全屏截图:(如无可不上传)

    申诉角色最近充值记录截图:(最近5笔或半年内充值截图)

    购买账号交易凭证截图:(交易订单,交易对话,如无可不上传)

    登录ip地址截图:(http://www.ipip.net/)点开后显示出ip地址进行全屏截图

    5.玩家填写完上述信息后,发送到客服邮箱。上述信息提交后,将在12小时内收到回复信息,已提交上述信息玩家,无需再次咨询在线客服,该问题将由专人处理。

    展开全文
  • 建立FTP对我来说不是什么问题,可是问题偏偏出现在客户端的访问上。 具体情况是这样的,建立完毕了FTP服务器,我用我的电脑中的腾讯TT,我一直用这个浏览器上网。测试访问FTP无问题。然后我试着用IE7测试访问了...
  • 易语言模块大全汇总批量下载

    热门讨论 2009-12-15 17:35:39
    易语言~模块~批量~下载 2008-11-08 14:41 文件夹 文件夹 易语言模块大全 2005-10-21 15:30 14489 3100 易语言模块大全\24位转单色位图模块.ec 2007-01-18 07:00 7110 2339 易语言模块大全\69msn.ec 2005-05-26 02:18...
  • 1350多个精品易语言模块提供下载

    热门讨论 2011-06-06 17:51:09
    取 腾讯TT浏览器的地址栏文本模块.ec 取节气模块.ec 取试用数据.ec 取非系统进程全路径文件名.ec 变身_超级编辑 框.ec 变速模块(1.0).EC 古木_选择文件夹.ec 古木滑块条_免注册版.ec 句柄操作.ec 各类已打开 的...
  • 易语言~模块~批量~下载 2008-11-08 14:41 文件夹 文件夹 易语言模块大全 2005-10-21 15:30 14489 3100 易语言模块大全\24位转单色位图模块.ec 2007-01-18 07:00 7110 2339 易语言模块大全\69msn.ec 2005-05-26 02:18...
  • 目前在网上关于TokyoCabinet(以下简称TC)和TokyoTyrant(以下简称TT)的资料已相对丰富了,但在.NET... 这里开放的是客户端主要功能代码,开源的目的一方面是希望更多的人来学习研究TC和TT,同时大家可以下载本...
  • TUP通讯协议

    2020-11-02 10:59:53
    底层基于流,传输建立连接(三次握手),传输可靠(数据完整)但是传输速度慢底层根据流来做数据传输,传输的数据没有大小限制适用场景:聊天、上传和下载等等 二、使用步骤 1.客户端 1.创建TCP客户端 2.发起连接 3...
  • Dropbox推广链接

    2011-11-03 10:22:23
    Dropbox使用https://www.dropbox.com还是可以访问的,能够下载客户端,能够同步。 如果你要注册,请使用我的链接:http://db.tt/GGaSiwh,谢谢!
  • 到网站下载直接打开,首次使用需要注册账号 设备管理 界面里可以检查设备是否正常init,起停atx-agent,抓取atx-agent.log文件 测试脚本调出脚本助手,实时界面同步,点击界面直接插入各种代码,同时支持...
  • Windows版dropbox1.0.28

    2011-04-05 11:03:25
    相当棒的自动同步工具,在任何地点都可以访问和编辑个人...官网目前只能访问,不能下载客户端,这个是翻一墙下载的当前最新版. ps.麻烦使用这个链接注册帐户,我们都可以得到额外的免费空间,拜托啦http://db.tt/SEy6PpQ
  • Java网络加载协议(JNLP)及Java Web Start

    千次阅读 2006-05-11 16:24:00
    原文:http://java.sun.com/jdc/JDCTechTips/2001/tt0530.html在java开发的早期,重点被放在了客户端开发。语言中对于applet和安全下载的支持对于万维网(WWW)的发布看上去是个不错的主意。但是现实是java最大的...
  • 下载sql server2008,,安装新的实例TT, 启动后本地连接正常,但是无法远程IP连接。 一开始以为是防火墙问题,关闭后,问题依然存在 安装telnet 客户端, telnet ip port ,无法连接。 网上搜索答
  • Dropbox免费网盘高级使用技巧

    千次阅读 2011-12-01 15:49:34
    通过充分开发DropBox这个优秀的免费网络同步硬盘的功能,我们其实还可以实现很多常规玩法之外的高级应用,例如获得额外存储空间,或是拿来管理你的BT下载客户端等等。http://db.tt/F6TkzeWG 通过此地址注册可得到...
  • Java网络加载协议(JNLP)及Java Web Start翻译:cheramimail:cherami@163.net 原文:http://java.sun.com/jdc/JDCTechTips/2001/tt0530.html在java开发的早期,重点被放在了客户端开发。语言中对于applet和安全下载...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    它包括客户端和服务端,客户端软件主要作用是监测本主机的活动,并将监测到的信息定时发送给服务器。服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

tt客户端下载