title: File Transport between Server/Client
body: <p>What kind of Service should I define for ".thrift"-file to use it later for my Program?</p>
  
  <p>This File Transport should be between the Client and the Server and it should be "partly".</p>
  
  <p>StreamFileService.thrift:</p>
  
  <pre><code>struct FileChunk {
  1: binary data
  2: i64 remaining
  }
  
  service StreamFileService {    
  FileChunk getBytes(1:string fileName, 2: i64 offset, 3: i32 size);    
  }
  </code></pre>
  
  <p>StreamFileClient.java:</p>
  
  <pre><code>public class StreamFileClient {
  private int fileChunkSize = 16;
  private String filePath;
  
  public String getFilePath() {
      return filePath;
  }
  
  public void setFilePath(String filePath) {
      this.filePath = filePath;
  }
  
  private void invoke() {
  
      try {
  
          TTransport theClientTransport = new TFramedTransport(new TSocket(
                  "127.0.0.1", 7911));
          TProtocol theProtocol = new TBinaryProtocol(theClientTransport);
          StreamFileService.Client theClient = new StreamFileService.Client(
                  theProtocol);
          theClientTransport.open();
  
          filePath = "/home/output/output.pdf";
          File theFile2 = new File(filePath);
          theFile2.createNewFile();
          FileInputStream stream = new FileInputStream(theFile2);
          long currentPosition = 0;
  
          FileChannel theFileChannel = stream.getChannel();
          boolean again = true;
  
          do {
              FileChunk chunk2 = theClient.getBytes(filePath,
                      currentPosition, fileChunkSize);
              currentPosition += fileChunkSize;
  
              theFileChannel.write(chunk2.data);
  
              if (chunk2.remaining == 0)
                  again = false;
  
          } while (again);
          stream.close();
  
      } catch (TTransportException e) {
          e.printStackTrace();
      } catch (TException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  
  public static void main(String[] args) {
      StreamFileClient theClient = new StreamFileClient();
  
      theClient.invoke();
  
  }
  </code></pre>
  
  <p>}</p>
  
  <p>StreamFileServer.java:</p>
  
  <pre><code>public class StreamFileServer {
  
  private void start() {
      try {
  
          TNonblockingServerTransport theServerSocket = new TNonblockingServerSocket(
                  7911);
          StreamFileService.Processor theProcessor = new StreamFileService.Processor(
                  new StreamFileServiceImpl());
          TServer theServer = new TNonblockingServer(
                  new TNonblockingServer.Args(theServerSocket)
                          .processor(theProcessor));
          System.out.println("Server starting on port 7911...");
  
          theServer.serve();
  
      } catch (TTransportException e) {
          e.printStackTrace();
      }
  
  }
  
  public static void main(String[] args) {
      StreamFileServer theFileServer = new StreamFileServer();
      theFileServer.start();
  }
  </code></pre>
  
  <p>}</p>
  
  <p>StreamFileServiceImpl:</p>
  
  <pre><code>  public class StreamFileServiceImpl implements StreamFileService.Iface {
  
  public FileChunk getBytes(String filePath, long offset, int size)
          throws TException {
  
      File theFile = new File("/home/input/kl_12.pdf");
      FileChunk chunk = new FileChunk();
  
      try {
  
          FileOutputStream stream = new FileOutputStream(theFile);
  
          MappedByteBuffer buffer = stream.getChannel().map(
                  FileChannel.MapMode.READ_ONLY, offset, size);
          chunk.data = buffer;
          chunk.remaining = stream.getChannel().size() - offset - size;
          stream.close();
  
      } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      return chunk;
  }
  </code></pre>
  
  <p>}</p>