【Java nio】Blocking nio2

package com.slp.nio;

import org.junit.Test;

import java.io.File;
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;

/**
 * Created by sanglp on 2017/3/1.
 */
public class TestBlockingNIO2 {
    //客户端
    @org.junit.Test
    public void client() throws IOException {
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1",9898));
        FileChannel fileChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.READ);
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        while (fileChannel.read(buffer)!=-1){
            buffer.flip();
            socketChannel.write(buffer);
            buffer.clear();
        }

        socketChannel.shutdownOutput();//不加这个会一直处于阻塞状态
        //接受服务器反馈
        int len=0;
        while (socketChannel.read(buffer)!=-1){
            System.out.println(new String(buffer.array(),0,len));
            buffer.clear();
        }
        fileChannel.close();
        socketChannel.close();

    }
    //服务端
    @Test
    public void server() throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        FileChannel outChannel = FileChannel.open(Paths.get("3.jpg"),StandardOpenOption.WRITE,StandardOpenOption.CREATE);
        serverSocketChannel.bind(new InetSocketAddress(9898));

        SocketChannel socketChannel = serverSocketChannel.accept();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        while (socketChannel.read(buffer)!=-1){
          buffer.flip();
            outChannel.write(buffer);
            buffer.clear();
        }

        //发送反馈
        buffer.put("服务器数据接收成功".getBytes());
        buffer.flip();
        socketChannel.write(buffer);
        socketChannel.close();
        serverSocketChannel.close();
    }
}
时间: 2024-08-23 04:32:19

【Java nio】Blocking nio2的相关文章

【JAVA NIO】Channels和Buffers

Channels和Buffers是JAVA NIO里面比较重要的两个概念,NIO正是基于Channels和Buffers进行数据操作,且数据总是从Channels读取到Buffers,或者从Buffers写入到Channels. 通道(Channel) 可以从通道写输入,也可以读数据: 通道的数据是跟Buffer进行交互的,数据可以读到Buffer,也可以从Buffer写数据到通道: 还可以异步读写数据: 以FileChannel为例,如下: FileChannel FileChannel是文件

【Java nio】buffer

1 package com.slp.nio; 2 3 import org.junit.Test; 4 5 import java.nio.ByteBuffer; 6 7 /** 8 * Created by sanglp on 2017/3/1. 9 * 一.缓冲区:在Java nio中负责数据的存储.缓冲区就是数据,用于村塾不同数据类型的数据 10 * 根据数据类型的不同(boolean类型除外),提供了相应类型的缓冲区 11 * ByteBuffer 12 * CharBuffer 13

【Java nio】 NonBlocking NIO

1 package com.slp.nio; 2 3 import org.junit.Test; 4 5 import java.io.IOException; 6 import java.net.InetSocketAddress; 7 import java.nio.ByteBuffer; 8 import java.nio.channels.SelectionKey; 9 import java.nio.channels.Selector; 10 import java.nio.chan

【Java NIO】

二. 1.通道只是连接作用,缓冲区才是数据存取 三. 1.使用NIO 完成网络通信的三个核心: (1)通道(Channel):负责连接 java.nio.channels.Channel接口: |--SelectableChannel |--SocketChannel |--ServerSocketChannel |--DatagramChannel |--Pipe.SinkChannel |--Pipe.SourceChannel (2)缓冲区(Buffer):负责数据的存取 (3)选择器(S

【Java NIO】系统基础

系统硬件 CPU - 中央处理单元 ALU - 算术逻辑单元 PC - 程序计数器 USB - 通用串行总线 总线 总线,贯穿整个系统的一组电子管道,在各个部件间传递字节流信息. 传送定长的字节块,称为字:字中的字节数,称为字长. 处理器 CPU,中央处理单元,是解释/执行存储在主存中指令的引擎. PC,程序计数器,在任何时间点上,都指向主存中某条机器语言指令(内含其地址). 寄存器文件,存储设备,CPU的核心.它是一个小的存储设备,由一些字长大小的寄存器组成,这些寄存器每个都有唯一的名字. A

【Java记录】try-with-resources的一个坑

[Java记录]try-with-resources的一个坑 今天处理 AsynchronousFileChannel 时候的一个问题,代码如下: public static void main(String[] args) throws Exception { String filePath = "/home/xe/git/osc/JavaNote/Lang/data/Test.java"; ExecutorService executorService = Executors.ne

【java解惑】前缀自增自减和后缀自增自减问题

    如下代码: public class Example025 { public static void main(String[] args) { int ape = 100; int it = 100; int ape_it = 100; for (int i = 0; i < 100; i++) { ape--; it = it--; ape_it = --ape_it; } System.out.println("ape = " + ape); System.out.

【java web】java执行预编译Groovy脚本

在JVM中运行Groovy类有两种方式: 使用Groovy编译所有的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类加载器来加载这些类. 通过groovy类加载器在运行时直接加载*.groovy文件并生成对象.在这种方式下,没有生成任何*.class,但是生成了一个java.lang.Class对象的实例. 下面介绍前一种使用Groovy的方法:编译成java字节码并且作为正常java应用程序运行在java虚拟机上,即预编译模式. 1.

【java解惑】重载构造函数

如下所示代码: public class Example046 { private Example046(Object o) { System.out.println("Object"); } private Example046(double[] dArray) {//2 System.out.println("double array"); } private Example046(String str) {//3 System.out.println(&quo