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. Django+Xadmin打造在线教育系统(八)

    首页和全局404,500配置 轮播图 公开课 授课机构 新建view ## 首页view class IndexView(View): def get(self,request): # 取出轮播图 a ...

  2. 如何使用JPQL写纯SQL语句

    使用JPQL,需要把SQL语句修改成类似HQL 语句.SQL 查询的是数据库,而JPQL 查询的是对象和属性,在语法上是有些不同的.对于有些用JPQL 无法写出来的查询,还是使用原生SQL写出来方便 ...

  3. TP5调用微信JSSDK 教程 - 测试成功案例

    前提:必需了解TP5的全局配置,扩展目录,composer,依赖注入的概念: 第一步:首先配置加载官方JSSDK类 "autoload": { "files": ...

  4. opencv 仿射变换

    import cv2 as cv import numpy as np img = cv.imread('../images/face.jpg') h, w = img.shape[:2] mat_s ...

  5. 【BZOJ2137】submultiple(数论)

    [BZOJ2137]submultiple(数论) 题面 BZOJ 题解 首先不难发现答案就是:\(\displaystyle\prod_{i=1}^n (\sum_{j=1}^{p_i+1}j^k) ...

  6. ZJOI 2019 划水记

    作为一个极其蒟蒻的OIer,虽然没有省选资格但还是去见见世面. ZJOI2019一试是在浙江省镇海中学.听名字就很霸气. 学习OI的最后一年,记录下一些事情,即使最终走到最后也一无所获,也是一段美好的 ...

  7. 【博弈论】浅谈泛Nim游戏

    Nim游戏在ACM中碰到了,就拎出来写写. 一般Nim游戏:有n堆石子,每堆石子有$a_i$个,每次可以取每堆石子中$[0,a_i-1]$,问先手是否有必胜策略. 泛Nim游戏:每堆石子有$a_i$个 ...

  8. rt-thread 学习路线

    @2019-01-25 [小记] > BSP制作与使用 将板载资源.芯片外设全部制作BSP,做到使用时只需在 menuconfig 中配置即用

  9. AXURE 8弄一个轮播图的步骤

    这个图是网上找到,7.0可以使用. 如果是8.0.没有找到"动态面板"这个地方,如下图所示

  10. A/D和D/A的学习

    从我们学到的知识了解到,我们的单片机是一个典型的数字系统.数字系统只能对输入的数字信号进行处理,其输出信号也是数字信号.但是在工业检测系统和日常生活中的许多物理量都是模拟量,比如温度.长度.压力.速度 ...