java 通过零拷贝实现有效数据传输

package sendfile;


import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.net.SocketAddress;

import java.nio.channels.FileChannel;

import java.nio.channels.SocketChannel;


public class TransferToClient {

public static void main(String[] args) throws IOException{

TransferToClient sfc = new TransferToClient();

sfc.testSendfile();

}

public void testSendfile() throws IOException {

   String host = "localhost";

   int port = 9026;

   SocketAddress sad = new InetSocketAddress(host, port);

   SocketChannel sc = SocketChannel.open();

   sc.connect(sad);

   sc.configureBlocking(true);


   String fname = "sendfile/NetworkInterfaces.c";

   long fsize = 183678375L, sendzise = 4094;

   

   // FileProposerExample.stuffFile(fname, fsize);

   FileChannel fc = new FileInputStream(fname).getChannel();

            long start = System.currentTimeMillis();

   long nsent = 0, curnset = 0;

   curnset =  fc.transferTo(0, fsize, sc);

   System.out.println("total bytes transferred--"+curnset+" and time taken in MS--"+(System.currentTimeMillis() - start));

   //fc.close();

 }



}


package sendfile;


import java.io.IOException;

import java.net.InetSocketAddress;

import java.net.ServerSocket;

import java.nio.ByteBuffer;

import java.nio.channels.ServerSocketChannel;

import java.nio.channels.SocketChannel;



public class TransferToServer  {

  ServerSocketChannel listener = null;

  protected void mySetup()

  {

    InetSocketAddress listenAddr =  new InetSocketAddress(9026);


    try {

      listener = ServerSocketChannel.open();

      ServerSocket ss = listener.socket();

      ss.setReuseAddress(true);

      ss.bind(listenAddr);

      System.out.println("Listening on port : "+ listenAddr.toString());

    } catch (IOException e) {

      System.out.println("Failed to bind, is port : "+ listenAddr.toString()

          + " already in use ? Error Msg : "+e.getMessage());

      e.printStackTrace();

    }


  }


  public static void main(String[] args)

  {

    TransferToServer dns = new TransferToServer();

    dns.mySetup();

    dns.readData();

  }


  private void readData()  {

 ByteBuffer dst = ByteBuffer.allocate(4096);

 try {

 while(true) {

 SocketChannel conn = listener.accept();

 System.out.println("Accepted : "+conn);

 conn.configureBlocking(true);

 int nread = 0;

 while (nread != -1)  {

 try {

 nread = conn.read(dst);

 } catch (IOException e) {

 e.printStackTrace();

 nread = -1;

 }

 dst.rewind();

 }

 }

 } catch (IOException e) {

 e.printStackTrace();

 }

  }

}


你可能感兴趣的:(java 通过零拷贝实现有效数据传输)