使用 ServerSocketChannel 实现的 File 服务器

第一章Netty,NIO零拷贝详细实现代码 本文提供了Java中两种零拷贝技术的实现方案: 基于transferTo的文件网络传输:适用于静态资源服务器或大文件传输场景,通过FileChannel.transferTo()方法实现内核态直接传输,避免用户态拷贝。服务端和客户端代码展示了完整的文件发送接收流程。 基于MappedByteBuffer的大文件随机读写:适用于数据库索引、日志分析等需要频繁随机访问的场景,通过内存映射文件实现高效访问,代码示例包含文件写入和读取操作。 文章最后强调了四个关键注意事项:资源释放、内存映射管理、小文件性能考量以及 阅读详情
package test.io;

import java.nio.channels.*;
import java.nio.charset.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.nio.*;

public class FileServer {
  private int port = 8050;

  private ServerSocketChannel serverSocketChannel;

  private Charset charset = Charset.forName("GBK");

  private Selector selector = null;

  public FileServer() throws IOException {
    selector = Selector.open();
    serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.socket().setReuseAddress(true);
    serverSocketChannel.socket().bind(new InetSocketAddress(port));
    System.out.println("服务器启动");
  }

  /* 编码过程 */
  public ByteBuffer encode(String str) {
    return charset.encode(str);
  }

  /* 解码过程 */
  public String decode(ByteBuffer bb) {
    return charset.decode(bb).toString();
  }

  /* 服务器服务方法 */
  public void service() throws IOException {
    serverSocketChannel.configureBlocking(false);
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    /** 外循环,已经发生了SelectionKey数目 */
    while (selector.select() > 0) {
      /* 得到已经被捕获了的SelectionKey的集合 */
      Iterator iterator = selector.selectedKeys().iterator();
      while (iterator.hasNext()) {
        SelectionKey key = null;
        try {
          key = (SelectionKey) iterator.next();
          iterator.remove();
          if (key.isAcceptable()) {
            ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
            SocketChannel sc = ssc.accept();
            System.out.println("客户端机子的地址是 " + sc.socket().getLocalAddress() + "  客户端机机子的端口号是 " + sc.socket().getLocalPort());
            sc.configureBlocking(false);
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE, buffer);
          }
          if (key.isReadable()) {
            reveice(key);
          }
          if (key.isWritable()) {
            send(key);
          }
        } catch (IOException e) {
          e.printStackTrace();
          try {
            if (key != null) {
              key.cancel();
              key.channel().close();
            }
          } catch (ClosedChannelException cex) {
            e.printStackTrace();
          }
        }
      }
      /* 内循环完 */
    }
    /* 外循环完 */
  }

  /* service方法完 */
  public void reveice(SelectionKey key) throws IOException {
    if (key == null)
      return;
    ByteBuffer buff = (ByteBuffer) key.attachment();
    SocketChannel sc = (SocketChannel) key.channel();
    buff.limit(buff.capacity());
    buff.position(0);
    sc.read(buff);
    buff.flip();
    String reviceData = decode(buff);
  }

  /* 发送文件 */
  public void send(SelectionKey key) {
    if (key == null)
      return;
    ByteBuffer buff = (ByteBuffer) key.attachment();
    SocketChannel sc = (SocketChannel) key.channel();
    String data = decode(buff);
    if (data.indexOf("get") == -1)
      return;
    String subStr = data.substring(data.indexOf(" "), data.length());
    System.out.println("截取之后的字符串是 " + subStr);
    FileInputStream fileInput = null;
    try {
      fileInput = new FileInputStream(subStr);
      FileChannel fileChannel = fileInput.getChannel();
      fileChannel.transferTo(0, fileChannel.size(), sc);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        fileInput.close();
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }

  public static void main(String[] args) throws IOException {
    new FileServer().service();
  }
}

 

http://www.java2000.net/viewthread.jsp?tid=6079

http://topic.youkuaiyun.com/u/20080610/02/6e33be0a-152f-481a-a10e-f9c11c8fd9ad.html?seed=577363641







<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
使用非阻塞ServerSocketChannel、SocketChannel代替ServerSocket和Socket NIO(服务端和客户端代码) 博文链接:https://songjianyong.iteye.com/blog/1757406 立即下载

相关推荐

Kettle 连接 Oracle 数据库全流程指南

例如:C:\Oracle\product\19.0.0\dbhome_1\jdbc\lib\ojdbc8.jar 2. 替换 Kettle 驱动文件 将驱动文件复制到 Kettle 的 目录: 删除旧版本驱动:如 ojdbc14.jar 只能保留一个oracle驱动 重启 Kettle 以加载新驱动 二、配置数据库连接 1. 启动 Kettle 并新建转换 运行 (Windows)或 (Linux)。 新建转换(Transformation),添加 “表输入” 步骤,双击进入配置。 2.

qq_44724453的博客 3481

ServerSocketChannel用法

ServerSocketChannel用法 Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。 打开 ServerSocketChannel 通过调用 ServerSocketChannel.open() 方法来打开ServerSocketChannel.如: ServerSocketChannel ser

m0_51001708的博客 3416

防雷防浪涌电路设计

通信线路或者电源线路通常会铺设到户外,一旦线路铺到户外后,就需要考虑防雷的问题了,那么怎么设计保护电路,能够防止雷电等浪涌对电路的破坏呢?

manhuami2007的博客 1万+

serversocket channel

serversocket channel 的NIO 处理

MOnotomy的博客 1063

保姆级教程:在Win10/Win11上搞定AppScan 10.0.0安装与许可证激活(含常见报错解决)

本文提供AppScan 10.0.0在Win10/Win11上的详细安装与许可证激活指南,涵盖环境准备、分步安装、文件替换技巧及常见报错解决方案。通过专业的安全测试工具部署实践,帮助用户高效完成安装并避免常见陷阱,提升Web应用安全扫描效率。

weixin_30800987的博客 425

HFSS螺旋线圈的设计与仿真

undefined.全局变量在这里进行设置:Project/Project Properties, browse and setup the global variables.undefined.方程中的局部变量设置:HFSS/Design Properties, browse and setup the local variables。按照下图填写曲线的方程内容:fill the parameters according to the setup in the following picture。

johnboat的专栏 3845

【ServerSocketChannel详解】

ServerSocketChannel是面向流的监听socket套接字的可选择性通道。具有以下特点:具有阻塞和非阻塞两种模式;可以注册到多路复用器上(且一般都与复用器配合使用);基于TCP连接;需要绑定到特定端口上;是线程安全的。SocketChannel提供了连接到socket的通道,提供了类似于java.net包中对于网络操作的api的功能。既然已经有连接到Socket套接字的通道,可以主动发起连接、传输数据(client端),功能就是接收连接、接收数据的通道(server端)。

m0_72397750的博客 1148

机械设计师必看:如何用Autodesk Inventor高效完成钣金设计(附实战案例)

本文为机械设计师详细解析了如何利用Autodesk Inventor Professional高效完成钣金设计。文章通过一个钣金防护罩的实战案例,系统介绍了从核心设计逻辑、建模流程、参数化技巧到工程图输出的完整工作流,旨在帮助设计师掌握智能化的设计方法,显著提升从概念到制造的设计效率与准确性。

honey的博客 1181

NIO学习之ServerSocketChannel和SocketChannel

NIO学习Socket 通道ServerSocketChannelSocketChannel与ServerSocketChannel区别 Socket 通道 (1)新的 socket 通道类可以运行非阻塞模式并且是可选择的,可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性。本节中我们会看到,再也没有为每个 socket 连接使用一个线程的必要了,也避免了管理大量线程所需的上下文交换开销。 借助新的 NIO 类,一个或几个线程就可以管理成百上千的活动 socket 连接了并且只有很少甚至可能

m0_53157173的博客 3784

《QT+PCL》点云配准进阶——GROR配准

GROR点云配准

阁楼 1318

Unreal5从入门到精通之Landscape地形系统

虚幻引擎 5 (UE5) 能够利用其强大的地形编辑工具套件创建大规模的地形世界。使用地形工具可以创建身临其境的户外地形,这些地形经过优化,可在多种不同设备上保持可播放的帧速率。

TxNet 4142

ServerSocketChannel类API详解(一)

ServerSocketChannel类 获得ServerSocketChannel与ServerSocket对象 ServerSocketChannel类是抽象的,并不能直接new实例化,但API中提供了public static ServerSocketChannel open()方法来创建ServerSocketChannel类的实例。open() 方法是静态的,作用是打开服务器套接.字通道。新通道的套接字最初是未绑定的;可以接受连接之前,必须通过它的某个套接字的bind()方法将其绑定到具体的地址。

吴声子夜歌的博客 5933

【GameFramework框架内置模块】15、场景(Scene)

场景(Scene)模块,提供场景管理的功能,负责场景的加载、卸载、切换和管理。可以方便地管理不同场景之间的切换以及不同场景之间的信息传递。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1883

【nio】使用 ServerSocketChannel 实现的 File 服务器[z]

From: http://www.java2000.net/p6079     package test.io; import java.nio.channels.*; import java.nio.charset.*; import java.net.*; import java.io.*; import java.util.*; import java.nio.*; ...

liudaoru - 悟 128

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java nio copy_使用java NIO实现复制文件

FileChannel src=new FileInputStream(new File(pathName_from)).getChannel();FileChannel dst=new FileOutputStream(new File(pathName_to)).getChannel();dst.transferFrom(src, 0, src.size());可能很多人以前都知道和使用过NI...

weixin_32115639的博客 586

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java Socket实战之七 使用Socket通信传输文件 .

前面几篇文章介绍了使用Java的Socket编程和NIO包在Socket中的应用,这篇文章说说怎样利用Socket编程来实现简单的文件传输。 这里由于前面一片文章介绍了NIO在Socket中的应用,所以这里在读写文件的时候也继续使用NIO包,所以代码看起来会比直接使用流的方式稍微复杂一点点。 下面的示例演示了客户端向服务器端发送一个文件,服务器作为响应给客户端会发一个文件。这里准备两个文件E:...

点点知识小屋 123

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

File总结

1)file 对文件进行操作,创建删除,但不能对文件数据进行读取,或修改。 字节流 2)InputStream —OutputStream 字节输入输出流,是所有字节流的父类,基于字节操作。 3)fileinputStream—fileoutputStream fileinputStream :文件读取流,对文件数据进行读取,单字节读取效率慢,所以需要用到,缓冲区,定义一个字节数组来存取...

weixin_44343761的博客 286

Java进阶(四十四)IO流12:NIO.2中Path、Paths、Files类的使用

一、NIO 1.1概述 Java NIO(new IO,No-Blocking IO)是从Java1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO类。NIO将以更加高效的方式进行文件的读写操作。 Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。 |-----java.nio.channels.Channel

qq_33491651的博客 540

java nio文件上传_Java Nio 实现文件的传输 | 学步园

使用Java Nio实现文件的传输1、ServerSocket.javapackage ch2;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.net.InetSocketAddress;im...

weixin_33785828的博客 480

NIO Channel(通道)类

实际上,通过read方法读数据,本身是很简单的,比较困难的是,在非阻塞模式下,如何知道通道何时是可读的呢?在阻塞模式下,SocketChannel通道的connect连接、read读、write写操作,都是同步的和阻塞式的,在效率上与Java旧的OIO的面向流的阻塞式读写操作相同。代码中的配置项,如服务器的IP、服务器端口、待发送的源文件名称(带路径)、远程的目标文件名称等配置信息,都是从system.properties配置文件中读取的,通过自定义的NioDemoConfig配置类来完成配置。

yitian881112的专栏 797

java file 堵塞_Java NIO -- 阻塞和非阻塞

传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行 IO操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降。Java NIO 是非阻塞模式的。当线程从某通道进行读写数据时,若没有数据可...

weixin_34847198的博客 491

Java通信之IO演进(四)- NIO之Channel

一 Channel(通道)介绍 通常来说NIO中的所有IO都是从 Channel(通道) 开始的。 从通道进行数据读取:创建一个缓冲区,然后请求通道读取数据。 从通道进行数据写入:创建一个缓冲区,填充数据,并要求通道写入数据。 数据读取和写入操作图示: Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以写,流一般来说...

Ginny_2019的博客 306

网络编程15

JDK中nio实现 ServerSocketChannel的继承关系 channel接口 InterruptibleChannel接口 是可以中断的 NetworkChannel接口 与网络通信有关 AbstractInterruptibleChannel抽象类 对InterruptibleChannel接口的实现 SelectableChannel抽象类 AbstractSelectableChannel抽象类 ServerSocketChannel抽象类 So

Markland_l的博客 158
上一篇: jar运行发生ClassNotFound的完整解决方案
下一篇: 关于防止重复刷投票的个人观点
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值