对于 NIO 的阻塞式通信,这么理解的对不

2020-03-14 17:21:13 +08:00
 amiwrong123
package TestNIO;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class BlockingClient {
    public static void main(String[] args) throws IOException {
        SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
        FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);

        ByteBuffer buf = ByteBuffer.allocate(1024);
        while (inChannel.read(buf) != -1) {
            buf.flip();
            sChannel.write(buf);
            buf.clear();
        }
        //sChannel.shutdownOutput();
        //inChannel.close();
        sChannel.close();
        while (true) {
            System.out.println("死循环");
        }
    }
}
package TestNIO;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class BlockingServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssChannel = ServerSocketChannel.open();
        ssChannel.bind(new InetSocketAddress(9898));
        FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"),
            StandardOpenOption.WRITE, StandardOpenOption.CREATE);

        SocketChannel sChannel = ssChannel.accept();
        System.out.println("BlockingServer accept");
        ByteBuffer buf = ByteBuffer.allocate(1024);
        System.out.println("BlockingServer accept1");
        int i = 2;
        while (sChannel.read(buf) != -1) {
            System.out.println("BlockingServer accept"+i++);
            buf.flip();
            outChannel.write(buf);
            buf.clear();
        }
        System.out.println("already get data, and output to local file");
        sChannel.close();
        outChannel.close();
        ssChannel.close();
    }
}

如上,是两个最简单的例子。经过几次 debug,有以下理解(也不知道对不对):

1248 次点击
所在节点    程序员
2 条回复
tairan2006
2020-03-15 11:03:07 +08:00
哥们你应该先了解 socket 通信的基本知识再看代码
Chinsung
2020-03-17 18:40:05 +08:00
nio,还是 java,首先得 select 搞搞,看看具体的 key,你才能明白大概是个什么原理。
建议找几个有图的看,然后自己照着例子试试 api。
nio 主要解决的是从底层开始搞定用低线程数处理大量连接的问题(相比较同步 IO ),可以了解下 linux 的 epoll,select。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/652804

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX