NIO传输文件

客户端:

 1 package com.gs.practice.nio;
 2
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.net.InetSocketAddress;
 6 import java.nio.ByteBuffer;
 7 import java.nio.channels.ClosedChannelException;
 8 import java.nio.channels.FileChannel;
 9 import java.nio.channels.SelectionKey;
10 import java.nio.channels.Selector;
11 import java.nio.channels.SocketChannel;
12 import java.util.Set;
13
14 /**
15  * Copyright (C),HTF<br>
16  * 客户端上传图片
17  *
18  * @author muzhongjiang
19  * @date 2014年9月5日
20  */
21 public class FileClient {
22     private int port = 8000;
23     private static ByteBuffer sendBuffer = ByteBuffer.allocate(1024);// 发送数据缓冲区
24     private InetSocketAddress SERVER;
25     private static Selector selector;
26     private static SocketChannel client;
27
28     public FileClient() throws Exception {
29         SERVER = new InetSocketAddress("localhost", port);
30         init();
31     }
32
33     /**
34      * 初始化
35      */
36     private void init() throws Exception {
37         SocketChannel socketChannel = SocketChannel.open();
38         socketChannel.configureBlocking(false);
39         selector = Selector.open();
40         socketChannel.register(selector, SelectionKey.OP_CONNECT);
41         socketChannel.connect(SERVER);
42         this.listener();
43     }
44
45     /**
46      * 监听器
47      */
48     private void listener() throws IOException, ClosedChannelException, Exception {
49         while (true) {
50             selector.select();
51             Set<SelectionKey> keySet = selector.selectedKeys();
52             for (final SelectionKey key : keySet) {
53                 if (key.isConnectable()) {
54                     client = (SocketChannel) key.channel();
55                     client.finishConnect();
56                     client.register(selector, SelectionKey.OP_WRITE);
57
58                 } else if (key.isWritable()) {
59                     this.sendFile(client);
60                 }
61             }
62             keySet.clear();
63         }
64     }
65
66     private void sendFile(SocketChannel client) throws Exception {
67         FileInputStream fis = null;
68         FileChannel channel = null;// 传输不同的数据选择对应的“通道”
69         fis = new FileInputStream("E:\\1.txt");
70         channel = fis.getChannel();
71         int i = 1;
72         int count = 0;
73         while ((count = channel.read(sendBuffer)) != -1) {
74             sendBuffer.flip();
75             int send = client.write(sendBuffer);
76             System.out.println("i===========" + (i++) + "   count:" + count + " send:" + send);
77             while (send == 0) {// 传输失败( 服务器端可能因为缓存区满,而导致数据传输失败,需要重新发送)
78                 Thread.sleep(10);
79                 send = client.write(sendBuffer);
80                 System.out.println("i重新传输====" + i + "   count:" + count + " send:" + send);
81             }
82             sendBuffer.clear();
83         }
84         channel.close();
85         fis.close();
86         client.close();
87     }
88
89     public static void main(String[] args) throws Exception {
90         new FileClient();
91     }
92 }

服务端:

  1 package com.gs.practice.nio;
  2
  3 import java.io.FileNotFoundException;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.net.InetSocketAddress;
  7 import java.net.ServerSocket;
  8 import java.nio.ByteBuffer;
  9 import java.nio.channels.ClosedChannelException;
 10 import java.nio.channels.FileChannel;
 11 import java.nio.channels.SelectionKey;
 12 import java.nio.channels.Selector;
 13 import java.nio.channels.ServerSocketChannel;
 14 import java.nio.channels.SocketChannel;
 15 import java.util.Set;
 16 /**
 17  * Copyright (C),HTF<br>
 18  * 图片服务器端
 19  *
 20  * @author muzhongjiang
 21  * @date 2014年9月5日
 22  */
 23 public class FileServer {
 24     private int port = 8000;
 25     private static ByteBuffer revBuffer = ByteBuffer.allocate(1024);// 接收数据缓冲区
 26     private static Selector selector;
 27     private static FileOutputStream fout;
 28     private static FileChannel ch;
 29
 30     public FileServer() throws Exception {
 31         init();
 32     }
 33
 34     /**
 35      * 初始化
 36      */
 37     private void init() throws Exception {
 38         ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
 39         serverSocketChannel.configureBlocking(false);
 40         ServerSocket serverSocket = serverSocketChannel.socket();
 41         serverSocket.bind(new InetSocketAddress(port));
 42         selector = Selector.open();
 43         serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
 44         System.out.println("server start on port:" + port);
 45         this.listener();
 46     }
 47
 48     /**
 49      * 监听器
 50      */
 51     private void listener() throws IOException, ClosedChannelException, FileNotFoundException {
 52         while (true) {
 53             selector.select();// 返回值为本次触发的事件数
 54             Set<SelectionKey> selectionKeys = selector.selectedKeys();
 55
 56             for (SelectionKey key : selectionKeys) {
 57                 ServerSocketChannel server = null;
 58                 SocketChannel client = null;
 59                 int count = 0;
 60                 if (key.isAcceptable()) {
 61                     server = (ServerSocketChannel) key.channel();
 62                     System.out.println("有客户端连接进入=============)");
 63                     client = server.accept();
 64                     client.configureBlocking(false);
 65                     client.register(selector, SelectionKey.OP_READ);
 66                     fout = new FileOutputStream("E:\\" + client.hashCode() + ".txt");
 67                     ch = fout.getChannel();
 68                 } else if (key.isReadable()) {
 69                     client = (SocketChannel) key.channel();
 70                     revBuffer.clear();
 71                     count = client.read(revBuffer);
 72                     int k = 0;
 73                     // 循环读取缓存区的数据,
 74                     while (count > 0) {
 75                         System.out.println("k=" + (k++) + " 读取到数据量:" + count);
 76                         revBuffer.flip();
 77                         ch.write(revBuffer);
 78                         fout.flush();
 79                         revBuffer.clear();
 80                         count = client.read(revBuffer);
 81                     }
 82                     if (count == -1) {
 83                         client.close();
 84                         ch.close();
 85                         fout.close();
 86                     }
 87                 } else if (key.isWritable()) {
 88                     System.out.println("selectionKey.isWritable()");
 89                 }
 90             }
 91             System.out.println("=======selectionKeys.clear()");
 92             selectionKeys.clear();
 93
 94         }
 95     }
 96
 97     public static void main(String[] args) throws Exception {
 98         new FileServer();
 99     }
100 }

时间: 2025-01-13 02:36:54

NIO传输文件的相关文章

Ganymed SSH2 模拟类似FileZilla远程传输文件(基于SCP协议)

Ganymed SSH2 模拟类似FileZilla远程传输文件(基于SCP协议) 为了传输文件或者目录,我们使用 Ganymed SSH2中的SCPClient类,这个类实现了scp命令功能. 下面的代码包含了传输单个文件和传输目录的功能: package com.doctor.ganymed_ssh2; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io

java对比IO和NIO的文件读写性能测试

原文:java对比IO和NIO的文件读写性能测试 源代码下载地址:http://www.zuidaima.com/share/1550463508466688.htm 1. NIO采用更接近操作系统执行IO的方式:通道和缓存器:顾名思义,数据源的数据由缓存器通过通道进行传输. 2. 在JDK5之后,原始IO系统底层用NIO进行了优化,这可以通过sun公布的源码中找到,但是,NIO系统性还是比IO强. 3. 在稍微研究了IO源码以及部分sun源码,我觉得IO系统的性能瓶颈主要是由于原始的IO架构因

java socket通信-传输文件图片--传输图片

ClientTcpSend.java   客户端发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.InetSocketAddress; import java.net.Socket; public class ClientTcpSend { public static String clien

securecrt在linux与windows之间传输文件(转)

摘自:http://blog.csdn.net/rangf/article/details/6096365 SecureCRT这款SSH客户端软件同时具备了终端仿真器和文件传输功能.比ftp命令方便多了,而且服务器不用再开FTP服务了.rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. windows端需要支持ZModem的telnet/ssh客户端,SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可).

ARM 开发板嵌入式linux系统与主机PC通过串口传输文件

本文转载自http://useless20.blog.163.com/blog/static/237409982010227127576/ 嵌入式linux系统与主机通过串口传输文件 我想如果要从PC机下载东西到开发板的嵌入式linux系统里面,很多人首先会想到用tftp sftp等网络工具从网口下载.但如果网络用不了,只能通过串口下载怎么办呢?这个时候有两个工具能帮到你:一个是zmrx.zmtx,另外一个是lsz.lrz.个人觉得zmrx/zmtx没有lsz/lrz稳定,建议还是用后者.下面介

串口传输文件 lrzsz

假设有一种开发环境,一块板子,除了串口,没有任何外部出入输出设备,没有sd卡,没有网线,这个时候如果你想跟这块板子传输交互文件,要怎么办? 根据modem所采用的文件传输协议:xmodem,ymodem,zmodem将其分类 xmodem:简单通用,传输信息单位是“包=128B”,传输速度慢,适合电话线路质量差的情况下用  ymodem:由XMODEM演变来,效率可靠性高,包=128*8B:一次传输可发送或接受几个文件 zmodem:于上两种不同,已连续的数据流发送数据,效率更高 在ubuntu

Linux SCP 命令: 利用SSH传输文件

在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp [email protected]:/path/filename /var/www/local_dir(本地目录) 例如scp [email protected]:/var/www/test.txt  把192.168.0.101上的/var/www/test.txt 的文件下载到/var/www/local_dir(本地目录) 2.上传本地文件到服务器scp /path/filename [email pr

Oracle工具之--ASM与文件系统及跨网络传输文件

Oracle工具之--ASM与文件系统及跨网络传输文件   Oracle DBMS_FILE_TRANSFER可以实现文件系统和ASM磁盘组之间实现文件传输及ASM磁盘组之间跨网络的传输. DBMS_FILE_TRANSFER:   The DBMS_FILE_TRANSFER package provides procedures to copy a binary file within a database or to transfer a binary file between datab

SCP实现无需密码传输文件

SCP概述 Linux为我们提供了两个用于文件copy的命令,一个是cp,一个是scp,但是他们略有不同 CP ----- 主要是用于在同一台电脑上,在不同的目录之间来回copy文件 SCP --- 主要是在不同的Linux系统之间来回copy文件 下面我们就主要讲一下SCP命令的基本用法: scp 传输文件路径 用户名@传输文件目标IP:目标路径(可以指定新的文件名) 在Linux环境下,两台主机之间传输文件一般使用scp命令,通常用scp命令通过ssh获取对方linux主机文件的时候都需要手