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


    http://blog.csdn.net/kongxx/article/details/7319410

    package com.googlecode.garbagecan.test.socket.nio;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.ClosedChannelException;
    import java.nio.channels.FileChannel;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.util.Iterator;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class MyServer4 {

    private final static Logger logger = Logger.getLogger(MyServer4.class.getName());

    public static void main(String[] args) {
    Selector selector = null;
    ServerSocketChannel serverSocketChannel = null;

    try {
    // Selector for incoming time requests
    selector = Selector.open();

    // Create a new server socket and set to non blocking mode
    serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.configureBlocking(false);

    // Bind the server socket to the local host and port
    serverSocketChannel.socket().setReuseAddress(true);
    serverSocketChannel.socket().bind(new InetSocketAddress(10000));

    // Register accepts on the server socket with the selector. This
    // step tells the selector that the socket wants to be put on the
    // ready list when accept operations occur, so allowing multiplexed
    // non-blocking I/O to take place.
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

    // Here's where everything happens. The select method will
    // return when any operations registered above have occurred, the
    // thread has been interrupted, etc.
    while (selector.select() > 0) {
    // Someone is ready for I/O, get the ready keys
    Iterator<SelectionKey> it = selector.selectedKeys().iterator();

    // Walk through the ready keys collection and process date requests.
    while (it.hasNext()) {
    SelectionKey readyKey = it.next();
    it.remove();

    // The key indexes into the selector so you
    // can retrieve the socket that's ready for I/O
    doit((ServerSocketChannel) readyKey.channel());
    }
    }
    } catch (ClosedChannelException ex) {
    logger.log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
    logger.log(Level.SEVERE, null, ex);
    } finally {
    try {
    selector.close();
    } catch(Exception ex) {}
    try {
    serverSocketChannel.close();
    } catch(Exception ex) {}
    }
    }

    private static void doit(final ServerSocketChannel serverSocketChannel) throws IOException {
    SocketChannel socketChannel = null;
    try {
    socketChannel = serverSocketChannel.accept();

    receiveFile(socketChannel, new File("E:/test/server_receive.log"));
    sendFile(socketChannel, new File("E:/test/server_send.log"));
    } finally {
    try {
    socketChannel.close();
    } catch(Exception ex) {}
    }

    }

    private static void receiveFile(SocketChannel socketChannel, File file) throws IOException {
    FileOutputStream fos = null;
    FileChannel channel = null;

    try {
    fos = new FileOutputStream(file);
    channel = fos.getChannel();
    ByteBuffer buffer = ByteBuffer.allocateDirect(1024);

    int size = 0;
    while ((size = socketChannel.read(buffer)) != -1) {
    buffer.flip();
    if (size > 0) {
    buffer.limit(size);
    channel.write(buffer);
    buffer.clear();
    }
    }
    } finally {
    try {
    channel.close();
    } catch(Exception ex) {}
    try {
    fos.close();
    } catch(Exception ex) {}
    }
    }

    private static void sendFile(SocketChannel socketChannel, File file) throws IOException {
    FileInputStream fis = null;
    FileChannel channel = null;
    try {
    fis = new FileInputStream(file);
    channel = fis.getChannel();
    ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
    int size = 0;
    while ((size = channel.read(buffer)) != -1) {
    buffer.rewind();
    buffer.limit(size);
    socketChannel.write(buffer);
    buffer.clear();
    }
    socketChannel.socket().shutdownOutput();
    } finally {
    try {
    channel.close();
    } catch(Exception ex) {}
    try {
    fis.close();
    } catch(Exception ex) {}
    }
    }
    }

    client

    package com.googlecode.garbagecan.test.socket.nio;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.net.SocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.channels.SocketChannel;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class MyClient4 {

    private final static Logger logger = Logger.getLogger(MyClient4.class.getName());

    public static void main(String[] args) throws Exception {
    new Thread(new MyRunnable()).start();
    }

    private static final class MyRunnable implements Runnable {
    public void run() {
    SocketChannel socketChannel = null;
    try {
    socketChannel = SocketChannel.open();
    SocketAddress socketAddress = new InetSocketAddress("localhost", 10000);
    socketChannel.connect(socketAddress);

    sendFile(socketChannel, new File("E:/test/client_send.log"));
    receiveFile(socketChannel, new File("E:/test/client_receive.log"));
    } catch (Exception ex) {
    logger.log(Level.SEVERE, null, ex);
    } finally {
    try {
    socketChannel.close();
    } catch(Exception ex) {}
    }
    }

    private void sendFile(SocketChannel socketChannel, File file) throws IOException {
    FileInputStream fis = null;
    FileChannel channel = null;
    try {
    fis = new FileInputStream(file);
    channel = fis.getChannel();
    ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
    int size = 0;
    while ((size = channel.read(buffer)) != -1) {
    buffer.rewind();
    buffer.limit(size);
    socketChannel.write(buffer);
    buffer.clear();
    }
    socketChannel.socket().shutdownOutput();
    } finally {
    try {
    channel.close();
    } catch(Exception ex) {}
    try {
    fis.close();
    } catch(Exception ex) {}
    }
    }

    private void receiveFile(SocketChannel socketChannel, File file) throws IOException {
    FileOutputStream fos = null;
    FileChannel channel = null;

    try {
    fos = new FileOutputStream(file);
    channel = fos.getChannel();
    ByteBuffer buffer = ByteBuffer.allocateDirect(1024);

    int size = 0;
    while ((size = socketChannel.read(buffer)) != -1) {
    buffer.flip();
    if (size > 0) {
    buffer.limit(size);
    channel.write(buffer);
    buffer.clear();
    }
    }
    } finally {
    try {
    channel.close();
    } catch(Exception ex) {}
    try {
    fos.close();
    } catch(Exception ex) {}
    }
    }
    }
    }

  • 相关阅读:
    Tx.Origin 用作身份验证
    区块链夺宝合约
    (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
    Oracle查看用户密码过期,修改永不过期
    springboot测试
    (转)Springboot定时任务
    书单
    (转)redis分布式锁-SETNX实现
    mybatis-generator 代码自动生成工具
    (转)通过Ajax使用FormData对象无刷新上传文件
  • 原文地址:https://www.cnblogs.com/jishumonkey/p/13889858.html
Copyright © 2020-2023  润新知