<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用于后臺各個服務間的通訊,Thrift的設計強調統一的編程接口的多語言通訊框架.

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

    1. 定義 idl文件,用來描述將要生成的數據通訊內容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 表示目錄結構,生成java時會產生java的package
    struct 表示數據結構體,在java下是一個bean對象,在c則對應struct結構
    service 表示服務類, 在java會生成DemoService.java。 提供兩個接口方法,客戶端和服務端都會擁有

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

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

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

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

    首先新建一個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();
        }
        

    }

    接下來為了方便使用,創建一個工廠類, 包括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()));
        }
    }

    這樣客戶端部分已經開發完成,非常快。

    4. 開發服務器端部分, 新建一個Server 類, 該類實現于 DemoService.Iface接口(實現要求的兩個方法即可)
    這里代碼中,可需要使用thrift的類庫,開啟Socket服務即可。
    完整源代碼如下:
    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提供各種服務監聽服務,包括傳統IO, New IO, Http方式. 還提供線程池的監聽服務等。
    下面是使用線程池的nio方式用法
    注:在使用NIO時,客戶端需要使用TFramedTransport,進行數據傳輸
    //客戶端代碼
        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;
        }

    //服務器端代碼
        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)
    主站蜘蛛池模板: 免费观看男人免费桶女人视频 | 中文字幕的电影免费网站| 亚洲毛片网址在线观看中文字幕 | 亚洲一区电影在线观看| 最新69国产成人精品免费视频动漫 | 亚洲女人18毛片水真多| 日本xxwwxxww在线视频免费| 中文在线观看国语高清免费| 亚洲fuli在线观看| 亚洲国产精品成人一区| 最近免费mv在线电影| 特级毛片aaaa级毛片免费| 亚洲精品在线视频观看| 亚洲乱亚洲乱少妇无码| 免费人成视频在线| 女同免费毛片在线播放| 国产成人亚洲精品蜜芽影院| 亚洲精品视频免费在线观看| 中文字幕亚洲日韩无线码| 男人的好免费观看在线视频| 最新国产乱人伦偷精品免费网站| 亚洲欧美日韩国产成人| 亚洲一卡2卡三卡4卡有限公司 | 亚洲另类春色校园小说| 亚洲区小说区图片区QVOD| 妞干网免费视频在线观看| 久久精品免费视频观看| www在线观看免费视频| 亚洲精品无码少妇30P| 亚洲视频在线观看地址| 亚洲无人区午夜福利码高清完整版 | g0g0人体全免费高清大胆视频| ASS亚洲熟妇毛茸茸PICS| 亚洲va中文字幕无码久久| 国产免费看插插插视频| 亚洲免费网站观看视频| 在线看无码的免费网站| a毛片全部免费播放| 一级毛片不卡免费看老司机| 亚洲av乱码一区二区三区按摩| 亚洲一级毛片免费看|