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();

 }

  }

}


转载于:https://my.oschina.net/u/1388024/blog/220029

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值