java NIO入门【原】
server
package com.server; import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel; public class Server { public static void main(String[] args) throws Exception {
//新建TCP服务端
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//绑定TCP端口
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
//配置成"非阻塞"
serverSocketChannel.configureBlocking(false);
while (true) {
//允许接收TCP链接
SocketChannel socketChannel = serverSocketChannel.accept();
//当有TCP连接上来时,获取到的就不为空
if (socketChannel != null) {
//写英文数据"生命不步,战斗不息"
String newData = System.currentTimeMillis() + ": Cease to struggle and you cease to live .";
//开辟缓存
ByteBuffer buf = ByteBuffer.allocate(1024);
//重置,准备写入数据到缓存
buf.clear();
//真正写入数据到缓存
buf.put(newData.getBytes());
//准备从缓存读取数据
buf.flip();
//如果读到数据有剩余
while (buf.hasRemaining()) {
//真正从缓存读取数据,并写入到通道中
socketChannel.write(buf);
}
}
}
}
}
client(默认非阻塞)
package com.client; import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel; public class client {
public static void main(String[] args) throws Exception {
//新建TCP服务端
SocketChannel socketChannel = SocketChannel.open();
//设置超时时间3秒,特别声明:这里浪费了大量时间研究和百度,只有正常的Socket的超时时间才有效,其实本处设置无效
//http://blog.csdn.net/d8111/article/details/45249783
socketChannel.socket().setSoTimeout(3000);
//链接到本地的9999端口
socketChannel.connect(new InetSocketAddress("localhost", 9999));
//开辟缓存
ByteBuffer buf = ByteBuffer.allocate(1024);
//重置,准备写入数据到缓存
buf.clear();
//真正从通道读取数据到缓存
int bytesRead = socketChannel.read(buf);
//准备从缓存读取数据
buf.flip();
//如果读到数据有剩余
while (buf.hasRemaining()) {
//取一个字节
byte b = (byte) (buf.get());
//转成一个字符
System.out.print((char) b);
}
//关闭通道
socketChannel.close();
}
}
client(手动配置阻塞)
package com.client; import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel; public class client {
public static void main(String[] args) throws Exception {
//新建TCP服务端
SocketChannel socketChannel = SocketChannel.open();
//设置超时时间3秒,特别声明:这里浪费了大量时间研究和百度,只有正常的Socket的超时时间才有效,其实设置本处无效
//参考: http://blog.csdn.net/d8111/article/details/45249783
//oracle bug id : http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4614802 JDK-4614802 : setSoTimeout does not work with nio SocketChannel
socketChannel.socket().setSoTimeout(3000);
//设置为非阻塞模式,默认阻塞
socketChannel.configureBlocking(false);
//链接到本地的9999端口
socketChannel.connect(new InetSocketAddress("localhost", 9999));
//当设置成非阻塞时,即异步时,需要先判断连接是否未定的,是否即将发 生的
if (socketChannel.isConnectionPending()) {
//如果即将发生连接,那么就等待连接建立完成,不然极有可能报java.nio.channels.NotYetConnectedException
socketChannel.finishConnect();
} //开辟缓存
ByteBuffer buf = ByteBuffer.allocate(1024);
//重置,准备写入数据到缓存
buf.clear();
//真正从通道读取数据到缓存
int bytesRead = socketChannel.read(buf);
//准备从缓存读取数据
buf.flip();
//如果读到数据有剩余
while (buf.hasRemaining()) {
//取一个字节
byte b = (byte) (buf.get());
//转成一个字符
System.out.print((char) b);
}
//关闭通道
socketChannel.close();
}
}
java NIO入门【原】的更多相关文章
- 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!
本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...
- Java NIO入门(二):缓冲区内部细节
Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...
- Java NIO入门
NIO入门 前段时间在公司里处理一些大的数据,并对其进行分词.提取关键字等.虽说任务基本完成了(效果也不是特别好),对于Java还没入门的我来说前前后后花了2周的时间,我自己也是醉了.当然也有涉及到机 ...
- Java NIO 入门
本文主要记录 Java 中 NIO 相关的基础知识点,以及基本的使用方式. 一.回顾传统的 I/O 刚接触 Java 中的 I/O 时,使用的传统的 BIO 的 API.由于 BIO 设计的类实在太 ...
- Java NIO入门小例(短连接:客户端和服务器一问一答)
例子中有些写法参考自Netty4源码,建议在实际运用中采用Netty,而非原生的Java NIO(小心epoll空转). 1. 服务器端 public class NioServer { static ...
- Java nio 笔记:系统IO、缓冲区、流IO、socket通道
一.Java IO 和 系统 IO 不匹配 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM 自身在 I/O 方面 ...
- Java Socket NIO入门
Java Socket.SocketServer的读写.连接事件监听,都是阻塞式的.Java提供了另外一种非阻塞式读写.连接事件监听方式——NIO.本文简单的介绍一个NIO Socket入门例子,原理 ...
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.A ...
- Mina入门:Java NIO基础概念
JDK1.4引入了Java NIO API(Java New IO),Java NIO得到了广泛应用.NIO允许程序进行非阻塞IO操作.java.nio.* 包括以下NIO基本结构: Buffer - ...
随机推荐
- 自学华为IoT物联网_05 能源工业物联网常见问题及解决方案
点击返回自学华为IoT物流网 自学华为IoT物联网_05 能源工业物联网常见问题及解决方案 1. 1 能源工业--油田业务面临的三大挑战 故障处理不及时: 部分油田开采难道大.机械故障较多.现场发生的 ...
- 【BZOJ2817】[ZJOI2012]波浪(动态规划)
[BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...
- css基本语法及页面引用
css基本语法 css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值.代码示例: div{ w ...
- centos7/rhel7下安装redis4.0集群
相关介绍:Redis从3.0版本开始支持集群! 集群一般由多个节点组成,节点数量至少6个才能保证组成完整高可用的集群. 每个节点需要开启配置文件中的cluster-enabled yes,让Redis ...
- redis主从复制几种结构
1.redis主从: 主从有好几种复制模式 一主一从:一个主服务器,一个从服务器,适合并发量较小的 一主多从:适合于读多写少的,结构: 3. 树状结构
- es6+的javascript拓展内容
一.let,const 1.因为块级的作用域,这样打印01234,循环外打印i会报错 for (let i = 0; i < 5; i++) { setTimeout(console.log(i ...
- 【P2303】Longge的问题
题目大意:求\[\sum\limits_{i=1}^ngcd(n,i)\] 题解:发现 gcd 中有很多是重复的,因此考虑枚举 gcd. \[\sum\limits_{i=1}^ngcd(n,i)=\ ...
- Flask flask_script扩展库
flask_script 1.安装:进入到虚拟环境中,pip install flask_script 2.flask_script 作用:可以通过命令行的形式来操作Flask,例如通过命令跑一个开发 ...
- gradle的安装配置成功标志
gradle主要位于AndroidStudio中 看我的目录 在环境变量里添加用户变量 GRADLE_HOME 然后在环境变量 path 中增加 %GRADLE_HOME%\bin;,如图所示 测试配 ...
- PMP证书的获取,不知道10大注意事项会吃亏
作为一个已经考过PMP的小项目经理我来说,近来接到不少咨询PMP的,有咨询考试事宜的,也有咨询后续的换审和PDU的,今天我这边就说说PMP项目管理证书要获取的一些注意事项,不注意的话可是会吃大亏的. ...