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 - ...
随机推荐
- python实用脚本集
iScript 是Github上 PeterDing 大神写的一个脚本集,由多数的 python 脚本和少数GM脚本组成. 含有以下几个脚本: xiami.py - 下载或播放高品质虾米音乐(xiam ...
- centos7/centos6修改系统默认语言
应用环境: 一直在使用centos7.x,系统默认的语言也是英文环境,工作内容偶遇中文,顺便搜罗修改一番,小记如下. 测试环境: 测试步骤: CentOS 7.x 1. 查看当前语言环境 [root@ ...
- hdu 1081 To The Max(二维压缩的最大连续序列)(最大矩阵和)
Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectangle ...
- map映照容器
//map映照容器是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系 //map映照容器的键值不允许重复 ,比较函数值对元素 //的键值进行比较,元素的各项数据可通过键值检索出来 ...
- ACM-ICPC 2015 ChangChun
比赛链接 :点击这里 大概会写 F G J L 吧 F 给你一个序列 最多删除一个数使他构成 最长不上升或者不下降子序列 这题不会不会on的算法只能 t*n*logn 了 还是压常过 求两次 LIS ...
- Apache POI - Java Excel APIs
文档来源:https://www.yiibai.com/apache_poi/ POI 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显 ...
- CF739E Gosha is hunting
法一: 匹配问题,网络流! 最大费用最大流,S到A,B流a/b费0,A,B到i流1费p[i]/u[i],同时选择再减p[i]*u[i]? 连二次!所以i到T流1费0流1费-p[i]*u[i] 最大流由 ...
- DP题组
按照顺序来. Median Sum 大意: 给你一个集合,求其所有非空子集的权值的中位数. 某集合的权值即为其元素之和. 1 <= n <= 2000 解: 集合配对,每个集合都配对它的补 ...
- MariaDB安装及基本配置
MariaDB安装及基本配置(CentOS6.9) 数据库基础概念 数据库(Database, DB)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. DBMS: Database ...
- 第二篇-Django建立数据库各表之间的联系(中)
上篇中已经建立了两个table,Book和Publish.这篇介绍如何用python增删改查数据库中的数据. 在views.py中创建一个index函数 from django.shortcuts i ...