Java NIO SocketChannel

  Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道。Java NIO相当于Java Networking的socket(套接字)。有两种创建SocketChannel的方法

  1. 打开SocketChannel并连接到互联网上的某个服务器。
  2. 当一个连接接入到一个ServerSocketChannel时,SocketChannel就会被创建

打开一个SocketChannel

  打开一个SocketChannel

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress(“http://jenkov.com”,80));

关闭SocketChannel

  使用完SocketChannel后,可以通过调用SocketChannel的close()方法,将其关闭。

代码展示:

socketChannel.close();  

从SocketChannel读取数据

  要从SocketChannel您那里读取数据,可以调用read()方法。

代码:

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = socketChannel.read(buf);

首先:进行Buffer分配,从SocketChannel中读取的数据到Buffer中

然后:调用SocketChannel的read()方法。将数据从SocketChannel中读Buffer。返回值是int,表示有多少字节数据被读入到Buffer缓存中。如果返回-1,则到达端到端(连接已关闭)。

数据写入SocketChannel

  SocketChannel使用SocketChannel的write() 方法来写入数据,该方法使用Buffer做参数。

代码展示:

String newData =“要写入文件的新字符串...”+ System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes()); buf.flip(); while(buf.hasRemaining()){
channel.write(buf);
}

  注意SocketChannel.write()在while循环中如何调用该方法。不能保证write()方法写入SocketChannel的字节数。因此,我们重复调用write(),直到Buffer没有字节可以写入。

非阻塞模式

  您可以将SocketChannel设置为非阻塞模式。在非阻塞模式下,你可以以异步方式调用connect()read()write()方法

connect()

  如果SocketChannel是非阻塞模式,并且您调用connect(),方法可能会在建立连接之前返回。要确定连接是否建立,可以调用finishConnect()方法,如下所示:

socketChannel.configureBlocking(假);
socketChannel.connect(new InetSocketAddress(“http://jenkov.com”,80)); while(!socketChannel.finishConnect()){
//做其他的事情
}

write()

  在非阻塞模式下,write()方法在不写任何数据的情况下可以返回。因此,你需要在循环中调用write()方法。代码同上。

read()

  在非阻塞模式下,read()方法可以在没有读取任何数据的情况下返回。因此,您需要注意返回的值int,这表示读取了多少个字节。

具有选择器的非阻塞模式

  这种非阻塞模式的SocketChannel效果要比Selector好点。通过使用Selector注册一个或一个以上SocketChannel,你可以访问已经准备读、写通道的Selector。

Java NIO ServerSocketChannel

  Java NIO ServerSocketChannel是可以监听接入TCP连接的通道,就像ServerSocket的Java标准网络一样。ServerSocketChannel类位于java.nio.channels包中。

java代码展示:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.socket().bind(new InetSocketAddress(9999));

while(true){
SocketChannel socketChannel =
serverSocketChannel.accept(); //用socketChannel做一些事情...
}

开启ServerSocketChannel

  通过调用ServerSocketChannel的open() 方法,你可以打开一个ServerSocketChannel

代码展示:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

关闭ServerSocketChannel

  通过调用ServerSocketChannel的close() 方法来关闭ServerSocketChannel。这是怎么样的样子:

serverSocketChannel.close();

监听接入的连接

  通过调用ServerSocketChannel的accept() 方法来监听传接入连接。当该accept()方法返回时,它返回SocketChannel一个传入连接。因此,accept()方法阻塞直到有连接介入。

  我们通常不会对单个连接进行监听,所以您可以在accept()内部调用一个循环,来监听多个接入的连接。

代码展示:

while(true){
SocketChannel socketChannel = serverSocketChannel.accept(); //用socketChannel做一些事情...
}

非阻塞模式

  ServerSocketChannel可以设置为非阻塞模式。在非阻塞模式下,accept()方法立即返回,如果没有连接,则返回null。因此,您必须检查返回值 SocketChannel是否为空。

代码展示:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.socket()。bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false); while(true){
SocketChannel socketChannel =
serverSocketChannel.accept(); if(socketChannel!= null){
//用socketChannel做一些事情...
}
}

Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel的更多相关文章

  1. Java IO学习笔记六:NIO到多路复用

    作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...

  2. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  3. Java NIO 学习笔记(四)----文件通道和网络通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  4. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  5. Java NIO 学习笔记(一)----概述,Channel/Buffer

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. Java NIO学习笔记

    Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...

  7. Java NIO 学习笔记(二)----聚集和分散,通道到通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. Java NIO 学习笔记(七)----NIO/IO 的对比和总结

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

随机推荐

  1. Hadoop 核心架构

    Hadoop 由许多元素构成.其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件.HDFS(对于本文)的上一层是Ma ...

  2. Linux添加硬盘和挂载

    1.使用fdisk -l 查看硬盘的详细信息 分析: 2.分区初始化 fdisk /dev/sdb 分析:各个参数的解析                   1. 输入 m 显示所有命令列示. 2. ...

  3. 关于vector push_back()与其他方式读取数据的效率对比

    引言: 在读取大量数据(数组)时,使用vector会尽量保证不会炸空间(MLE),但是相比于scanf的读取方式会慢上不少.但到底效率相差有多大,我们将通过对比测试得到结果. 测试数据:利用srand ...

  4. 罪恶的SEO优化

    1. 基础概念开始 SEO,搜索引擎优化.概括来说就是针对分析搜索引擎的网站收录以及评价规律,来对网站的结构,内容以及其他因素作出一些合理调整,使得网站更容易被搜索引擎收录,并且能够尽量排在搜索引擎自 ...

  5. IOS对话框UIAlertView

    //修改弹出对话框的样式 alertView.alertViewStyle = UIAlertViewStylePlainTextInput; //根据索引获取指定的某个文本框 [alertView ...

  6. php实现‘浏览记录’按日期分组

    出题:现有测试数据如下,要求实现如下图中的效果: array(4) { [0] => array(6) { ["visit_id"] => int(127) [&quo ...

  7. Socket中的异常和参数设置

    1.常见异常 1.java.net.SocketTimeoutException . 这个异 常比较常见,socket 超时.一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 ...

  8. Python数据类型和变量

    一.数据类型1.整型整型类型比较简单,就是我们数学中的正整数(1,2,520..).负整数(-2,-9..);与java不同的是,python中的整数可以无限大,而java的整数类型int为四个字节, ...

  9. gitignore.io-程序猿值得拥有的智能生成gitignore文件的秘密武器

    gitignore.io Create useful .gitignore files for your project by selecting from 360 Operating System, ...

  10. 【2017-05-17】WebForm

    ASP.NET分为:ASP.NET WebForm和ASP.NET MVC 运行机制:C/S(客户端应用程序)代码在客户端执行,仅仅去服务器上的数据库存取数据 B/S(网站应用程序)程序代码在服务器上 ...