<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 156,  comments - 601,  trackbacks - 0
    Thrift出自Facebook用于后臺各個服務(wù)間的通訊,Thrift的設(shè)計強調(diào)統(tǒng)一的編程接口的多語言通訊框架.

    下面將通過一個實例來講解Thrift的使用方法:

    1. 定義 idl文件,用來描述將要生成的數(shù)據(jù)通訊內(nèi)容API接口,以下面一個簡單例子來說明service.idl
    namespace java com.xmatthew.thrift.demo

    struct Info {
      
    1: string key,
      
    2: binary value,
    }

    service    DemoService{
        void add(
    1:string key, 2:binary value);
        binary get(1:string key),
    }
    說明:
    namespace 表示目錄結(jié)構(gòu),生成java時會產(chǎn)生java的package
    struct 表示數(shù)據(jù)結(jié)構(gòu)體,在java下是一個bean對象,在c則對應(yīng)struct結(jié)構(gòu)
    service 表示服務(wù)類, 在java會生成DemoService.java。 提供兩個接口方法,客戶端和服務(wù)端都會擁有

    2. 生成特定語言源文件,下面以java為例

    thrift-0.6.0.exe -r --gen java service.idl

    運行成功后,會生成gen-java文件,下面就是源碼文件
    本例中會產(chǎn)生兩個文件
    Info.java
    DemoService.java

    3. 開發(fā)客戶端
    有了這兩個文件后,接下來就需要把thrift的java類庫引進來,就可以開發(fā)客戶端部分了

    首先新建一個LocalClient類,繼承于DemoServer.Client類,源碼如下:
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TTransport;
    import org.apache.thrift.transport.TTransportException;

    import com.xmatthew.thrift.demo.DemoService.Client;

    /**
     * 
    @author xiemalin
     *
     
    */
    public class LocalClient extends Client {
        
    private TTransport transport;
        
        
    public LocalClient(TProtocol prot,int port, TTransport ftransport) throws TTransportException {
            
    super(prot);
            
    this.transport  = ftransport;
        }
        
        
    public void close(){
            
    this.transport.close();
        }
        

    }

    接下來為了方便使用,創(chuàng)建一個工廠類, 包括main方法,進行使用示例
    import java.io.IOException;
    import java.nio.ByteBuffer;

    import org.apache.thrift.TException;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TSocket;
    import org.apache.thrift.transport.TTransportException;

    public class ClientFactory {

        
    public static LocalClient getClient(String ip,int port) throws TTransportException, IOException{
            TSocket transport 
    = new TSocket(ip,port);
            
            TProtocol protocol 
    = new TBinaryProtocol(transport);
            transport.open();
            LocalClient client 
    = new LocalClient(protocol, port,transport) ;
            
    return client;
        }
        
        
        
    public static void main(String[] args) throws IOException, TException {
            LocalClient client 
    = ClientFactory.getClient("localhost"8900);
            ByteBuffer bb 
    = ByteBuffer.wrap("Hello".getBytes());
            client.add(
    "abc", bb);
            System.out.println(
    "ok");
            
            System.out.println(
    new String(client.get("aaa").array()));
        }
    }

    這樣客戶端部分已經(jīng)開發(fā)完成,非??臁?br />
    4. 開發(fā)服務(wù)器端部分, 新建一個Server 類, 該類實現(xiàn)于 DemoService.Iface接口(實現(xiàn)要求的兩個方法即可)
    這里代碼中,可需要使用thrift的類庫,開啟Socket服務(wù)即可。
    完整源代碼如下:
    import java.nio.ByteBuffer;

    import org.apache.thrift.TException;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TBinaryProtocol.Factory;
    import org.apache.thrift.server.TThreadPoolServer;
    import org.apache.thrift.server.TThreadPoolServer.Args;
    import org.apache.thrift.transport.TServerSocket;
    import org.apache.thrift.transport.TServerTransport;
    import org.apache.thrift.transport.TTransportException;

    import com.xmatthew.thrift.demo.DemoService;
    import com.xmatthew.thrift.demo.DemoService.Iface;

    public class Server implements Iface {
        
        
    private final int port ;
        
        
    private final TThreadPoolServer tr_server;
        
        
    public Server(int _port) throws TTransportException{
            
    this.port = _port;
            Factory protoFactory 
    = new TBinaryProtocol.Factory(truetrue);
            TServerTransport serverTransport 
    = new TServerSocket(port);
            DemoService.Processor processor 
    = new DemoService.Processor(this);
            tr_server 
    = new TThreadPoolServer(new Args(serverTransport).processor(processor)
                    .protocolFactory(protoFactory));
        }

        
    public void run(){
            tr_server.serve();
        }
        
        
    public synchronized void close(){
            tr_server.stop();
        }

        
    public void add(String key, ByteBuffer value) throws TException {
           System.out.println(
    "invoke 'add'("+key+","+new String(value.array())+")");
            
        }

        
    public ByteBuffer get(String key) throws TException {
            System.out.println(
    "invoke 'set'("+key+")");
            ByteBuffer bb 
    = ByteBuffer.wrap("get success".getBytes());
            
    return bb;
        }


        
    public static void main(String[] args) throws TTransportException {
            Server server 
    = new Server(8900);
            server.run();
        }
    }

    thrift提供各種服務(wù)監(jiān)聽服務(wù),包括傳統(tǒng)IO, New IO, Http方式. 還提供線程池的監(jiān)聽服務(wù)等。
    下面是使用線程池的nio方式用法
    注:在使用NIO時,客戶端需要使用TFramedTransport,進行數(shù)據(jù)傳輸
    //客戶端代碼
        public static LocalClient getClient(String ip,int port) throws TTransportException, IOException{
            TSocket transport 
    = new TSocket(ip,port);
            TFramedTransport tt 
    = new TFramedTransport(transport);
            TProtocol protocol 
    = new TBinaryProtocol(tt);
            tt.open();
            LocalClient client 
    = new LocalClient(protocol, port, tt) ;
            
    return client;
        }

    //服務(wù)器端代碼
        public Server(int _port) throws TTransportException{
            
    this.port = _port;
            Factory protoFactory 
    = new TBinaryProtocol.Factory(truetrue);
    //        TServerTransport serverTransport = new TServerSocket(port);
            DemoService.Processor processor = new DemoService.Processor(this);
    //        tr_server = new TThreadPoolServer(new Args(serverTransport).processor(processor)
    //                .protocolFactory(protoFactory));
            
            TNonblockingServerTransport nioTransport 
    = new TNonblockingServerSocket(port);
            tr_server 
    = new TNonblockingServer(new Args(nioTransport).processor(processor)
                    .protocolFactory(protoFactory));
        }



    5. 下面就可以分別運行 main方法,進行測試即可。


    Good Luck!
    Yours Matthew!

    posted on 2011-11-12 18:57 x.matthew 閱讀(17899) 評論(4)  編輯  收藏 所屬分類: Best Practise(JDK API)
    主站蜘蛛池模板: 欧洲精品成人免费视频在线观看 | 国内大片在线免费看| 精品无码一级毛片免费视频观看| 456亚洲人成影院在线观| 无码乱人伦一区二区亚洲一| gogo全球高清大胆亚洲| 无码人妻精品一二三区免费| 日韩免费无码一区二区三区| caoporn成人免费公开| 亚洲精品理论电影在线观看| 亚洲伊人久久大香线焦| 亚洲精品综合一二三区在线| 亚洲人成网77777亚洲色| 亚洲欧洲国产成人综合在线观看| 免费看少妇作爱视频| 一个人免费高清在线观看| 亚洲视频免费在线看| 最近中文字幕mv免费高清在线| 亚洲av午夜电影在线观看| 在线观看视频免费国语| 亚洲中文字幕日产乱码高清app| 韩国免费A级毛片久久| 亚洲高清无码专区视频| 成av免费大片黄在线观看| 亚洲成a人片在线观看日本麻豆| 好吊妞788免费视频播放| 国产香蕉九九久久精品免费| 91麻豆最新在线人成免费观看| 亚洲精品视频免费看| 99精品免费观看| 在免费jizzjizz在线播| 国产a视频精品免费观看| 国产在线观看麻豆91精品免费| 青青草无码免费一二三区| 在线观看的免费网站无遮挡| 最近免费中文字幕高清大全| 希望影院高清免费观看视频| 韩国免费一级成人毛片| 韩国18福利视频免费观看| 国产美女被遭强高潮免费网站| 免费精品国产自产拍观看|