NIO学习笔记四 :SocketChannel 和 ServerSocketChannel
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:
打开一个SocketChannel并连接到互联网上的某台服务器。
SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress(90));
一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(90));
SocketChannel channel = serverSocketChannel.accept();
关闭 SocketChannel
当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel:
 socketChannel.close();
往SocketChannel中写入数据
 ByteBuffer buffer = ByteBuffer.allocate(1024);
        buffer.clear();
        buffer.put("测试数据".getBytes("UTF-8"));
        buffer.flip();
        while(buffer.hasRemaining()){
            socketChannel.write(buffer);
        }
读取SocketChannel 中的数据
 ByteBuffer buffer = ByteBuffer.allocate(1024);
 int read = channel.read(buffer);
示例代码
 客户端
 public class SocketChanneClient {
    public static void main(String args[]) throws Exception {
        SocketChannel channel = SocketChannel.open();
        channel.connect(new InetSocketAddress(90));
        while (true) {
            Scanner scanner = new Scanner(System.in);
            String message = scanner.next();
            sendMessage(channel,message);
        }
}
public static void sendMessage(SocketChannel socketChannel, String mes) throws IOException {
        if (mes == null || mes.isEmpty()){
            return;
        }
        byte[] bytes = mes.getBytes("UTF-8");
        int size = bytes.length;
        ByteBuffer buffer = ByteBuffer.allocate(size);
        buffer.clear();
        buffer.put(bytes);
        buffer.flip();
        while(buffer.hasRemaining()){
            socketChannel.write(buffer);
        }
        socketChannel.close();
}
}
服务端
public class ServerSocketChannelServer {
    public static void main(String[] args) throws IOException{
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(90));
        ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 10, 1000, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(100));
        while (true){
            SocketChannel channel = serverSocketChannel.accept();
            if ((channel !=null)){
                executor.execute( new SocketChannelThread(channel));
            }
        }
    }
}
线程池处理类
public class SocketChannelThread implements Runnable {
    private SocketChannel channel;
    private String remoteName;
public SocketChannelThread(SocketChannel channel) throws IOException {
        this.channel = channel;
        this.remoteName = channel.getRemoteAddress().toString();
        System.out.println("客户:" + remoteName + " 连接成功!");
    }
@Override
    public void run() {
        ByteBuffer buffer = ByteBuffer.allocate(1024);
byte b[];
        while (true) {
            try {
                b = new byte[1024];
                buffer.clear();
                int read = channel.read(buffer);
                StringBuilder sb = new StringBuilder();
                if (read != -1) {
                    buffer.flip();
                    int index = 0;
                    while (buffer.hasRemaining()) {
                        b[index++] = buffer.get();
                        if (index >= read) {
                            index = 0;
                            sb.append(new String(b, "UTF-8"));
                            System.out.println(remoteName + ":" + sb.toString());
                        }
                    }
                    buffer.clear();
                }
} catch (Exception e) {
                System.out.println(remoteName + " 断线了,连接关闭");
                try {
                    channel.close();
                } catch (IOException ex) {
                }
                break;
            }
        }
    }
}
以上创建SocketChannel 是阻塞式的 ,同时也支持非阻塞式的。
阻塞是服务端读取SocketChannel 数据时,如果读取不到,进程一直阻塞直到客户端有数据请求到服务端。
非阻塞是服务端读取SocketChannel 数据时,如果读取不到,java.nio.channels.SocketChannel#read(java.nio.ByteBuffer) 方法返回0
设置非阻塞模式
channel.configureBlocking(false);
NIO学习笔记四 :SocketChannel 和 ServerSocketChannel的更多相关文章
- Java NIO学习笔记六   SocketChannel 和 ServerSocketChannel
		Java NIO SocketChannel Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道.Java NIO相当于Java Networking的sock ... 
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
		转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ... 
- Java NIO学习笔记四     NIO选择器
		Java NIO选择器 A Selector是一个Java NIO组件,可以检查一个或多个NIO通道,并确定哪些通道已准备就绪,例如读取或写入.这样一个线程可以管理多个通道,从而管理多个网络连接. 为 ... 
- Java NIO 学习笔记(四)----文件通道和网络通道
		目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ... 
- Java NIO学习笔记
		Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ... 
- Java NIO 学习笔记(三)----Selector
		目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ... 
- Java NIO 学习笔记(一)----概述,Channel/Buffer
		目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ... 
- Java:NIO 学习笔记-3
		Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ... 
- Java:NIO 学习笔记-1
		Java:NIO 学习笔记-1 说明:本笔记是根据bilibili上 尚硅谷 的课程 NIO视频 而做的笔记 主要内容 Java NIO 简介 Java NIO 与 IO 的主要区别 缓冲区(Buff ... 
随机推荐
- opentwebst一个ie自动化操作测试软件-功能强大
			opentwebst一个ie自动化操作测试软件-功能强大 一个ie自动化操作测试软件,自动根据操作记录脚本.生成vbs,js和其他脚本语言,用来运行 里面包含了两个东西: 1.脚本操作自动记录,记录下 ... 
- 如何在html与delphi间交互代码
			[转]如何在html与delphi间交互代码 (2015-11-19 22:16:24) 转载▼ 标签: it 分类: uniGUI uniGUI总群中台中cmj朋友为我们总结了如下内容,对于利用de ... 
- css3的动画效果
			全新的css3加入的动画效果: [ animation-name ]:检索或设置对象所应用的动画名称 [ animation-duration ]: 检索或设置对象动画的持续时间 [ animatio ... 
- 使用Docker搭建CentOS 7 + Apache 2.4+ PHP7
			从Docker Hub上Pull最新的CentOS 7镜像并新建容器 # sudo docker pull centos docker run -p 8082:80 --name centos_c - ... 
- Fetch的使用及兼容ie的处理
			Fetch 作为一个与时俱进的前端,Fetch当然应该有所了解和涉猎.如果你没有听说过Fetch,那么ajax应该不陌生吧.Fetch相当于是一个新版本的Ajax,虽然现在我们常常使用的仍是ajax, ... 
- 使用 Navicate 连接 Oracle9i 数据库
			Navicat Premium 是一个可多重连接的数据库管理工具,它可让你以单一程序同時连接到 MySQL.SQLite.Oracle 及 PostgreSQL 数据库,让管理不同类型的数据库更加方便 ... 
- AndroidStudio制作登录和注册功能的实现,界面的布局介绍
			前言 大家好,给大家带来AndroidStudio制作登录和注册功能的实现,界面的布局介绍的概述,希望你们喜欢 每日一句: Success is connecting with the world a ... 
- 分布式任务调度系统xxl-job源码探究(二、服务中心)
			接下来看下服务端代码 服务端源码 服务端通过管理quartz定时任务组件,分发任务 先从入口看起,由web.xml进入,可以看出,自己编写的代码从applicationcontext-xxl-job- ... 
- 构建NTP时间服务器
			NTP服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服务器与时间服务器的时间保持一致,某些应用对时间实时性要求高的必须统一时间. 互联网的时间服务器也有很多,例如ntpdate ntp. ... 
- 测试工具之RobotFramework界面基本功能使用
			安装好RobotFramework后,直接在运行或者命令行中执行ride.py即可启动RF 启动完成后的界面如下: 界面很简洁,然后我们开始点击file并创建project: 接下来右键project ... 
