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入门【原】的更多相关文章

  1. 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!

    本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...

  2. Java NIO入门(二):缓冲区内部细节

    Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...

  3. Java NIO入门

    NIO入门 前段时间在公司里处理一些大的数据,并对其进行分词.提取关键字等.虽说任务基本完成了(效果也不是特别好),对于Java还没入门的我来说前前后后花了2周的时间,我自己也是醉了.当然也有涉及到机 ...

  4. Java NIO 入门

    本文主要记录 Java 中  NIO 相关的基础知识点,以及基本的使用方式. 一.回顾传统的 I/O 刚接触 Java 中的 I/O 时,使用的传统的 BIO 的 API.由于 BIO 设计的类实在太 ...

  5. Java NIO入门小例(短连接:客户端和服务器一问一答)

    例子中有些写法参考自Netty4源码,建议在实际运用中采用Netty,而非原生的Java NIO(小心epoll空转). 1. 服务器端 public class NioServer { static ...

  6. Java nio 笔记:系统IO、缓冲区、流IO、socket通道

    一.Java IO 和 系统 IO 不匹配 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM 自身在 I/O 方面 ...

  7. Java Socket NIO入门

    Java Socket.SocketServer的读写.连接事件监听,都是阻塞式的.Java提供了另外一种非阻塞式读写.连接事件监听方式——NIO.本文简单的介绍一个NIO Socket入门例子,原理 ...

  8. JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)

    Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.A ...

  9. Mina入门:Java NIO基础概念

    JDK1.4引入了Java NIO API(Java New IO),Java NIO得到了广泛应用.NIO允许程序进行非阻塞IO操作.java.nio.* 包括以下NIO基本结构: Buffer - ...

随机推荐

  1. bzoj 3123 [Sdoi2013]森林(主席树+启发式合并+LCA)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  2. angularJS 路由加载js controller 未定义 解决方案

    说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案. 路由 $routeProvider 异步加载js 路由的基本用法,请查看 ...

  3. Android RadioGroup 学习

    Api 参考地址 博文地址 RadioGroup相关属性: //返回该单选按钮组中所选择的单选按钮的标识 ID,如果没有选中的单选按钮则返回 -1. RadioGroup.getCheckedRadi ...

  4. 【WC2018】即时战略(动态点分治,替罪羊树)

    [WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...

  5. Tarjan求有向图强连通详解

    Tarjan求有向图强连通详解 注*该文章为转发,原文出处已经不得而知 :first-child { margin-top: 0; } blockquote > :last-child { ma ...

  6. IncDec Sequence(差分)

    题意:给定一个序列,可以对一个区间进行加1或减1的操作,问最少需要多少次可以将序列的值一样. Solution 我们将序列差分,得到一个差分数组. 对于每一个区间操作,我们可以把它转化为在查分数组上某 ...

  7. Hyper-V:无法打开虚拟机XXX,因为虚拟机监控程序未运行

    异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 异常处理汇总-开发工具  http://www.cnblogs.com/duni ...

  8. SQL查询语句的进阶使用

    MySQL的进阶使用 sql语句一些功能的使用 导入现有大量数据文件步骤 1) 把*.sql文件拷贝到Linux某一位置(例如Desktop) 2) Linux命令行进入该位置 cd ~/Deskto ...

  9. N球M盒

    N球,M盒,由于球是否相同,盒是否相同,盒是否可以为空,共2^3=8种: 1.球同,盒同,盒不可以为空Pm(N)--这符号表示部分数为m的N-分拆的个数,m是P的下标,为了好看我将大写的M弄成小写 2 ...

  10. [luogu3709][大爷的字符串题]

    题目链接 题意 一天做到两道这种题目描述如此神仙的题也是够了.真锻炼语文能力. 题目的意思其实就是,给你一个序列,然后每次询问一个区间.使得尽量按照严格上升的顺序从这个区间内取数.如果当前取得数字小于 ...