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

Wesley13
• 阅读 430

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

 }

  }

}

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java 复制Map对象(深拷贝与浅拷贝)
java复制Map对象(深拷贝与浅拷贝)CreationTime2018年6月4日10点00分Author:Marydon1.深拷贝与浅拷贝  浅拷贝:只复制对象的引用,两个引用仍然指向同一个对象
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java解析excel表格数据
packagecom.hans.controller;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.text.DecimalFormat;
Wesley13 Wesley13
3年前
java基础
需求:递归遍历一个目录,筛选出需要查找的文件类型实现:分别用Java流式实现和递归实现代码:packagehello;importjava.io.File;importjava.io.IOException;importjava.nio.file.FileSystems;import
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Excel转JAVA集合对象
packagecom.ccbpay.cloud.util;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.math.BigDecimal;importjava.text.SimpleDateFormat;import
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了