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. 手机Web 开发中图片img 如何等比例缩放

    如果图片本身没有设置 width.height属性的话,只需要修改 max-width:100%; 就可以了 如果图片本身设置了 width.height属性的话,需要同时修改width 和heigh ...

  2. MT【280】最小值函数

    已知正系数二次函数$ax^2+bx+c=0$有实数根,证明:$\min\{a,b,c\}\le\dfrac{a+b+c}{4}$ 证明:$\min\{a,b,c\}=\dfrac{a+c-|a-c|+ ...

  3. 安装 linux-dash

    先看看软件的效果图,再介绍安装方法. 通过上图可以看到.软件可以实时监控CPU.内存.网络流量等相关信息,甚至可以监控到硬件信息安装方法:yum -y install httpd php zip un ...

  4. Chemical table CFR500 div2D(并查集)

    给定的一个n*m的区域内,给出一些点的坐标,这些点上有一个元素,如果在矩形的子矩形的三个点都有元素,那么第四个点的元素可以自己产生,其他的元素需要购买,问最少需要购买多少中元素才可以把这个区域给填满. ...

  5. 2018蓝桥杯 省赛D题(测试次数)

    x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机.各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通.x星球 ...

  6. mysql慢查询,死锁解决方案

    1. 先使用root用户登录到MySQL中 2. 使用show processlist查看其查询速率 +----+------+-----------------+------+---------+- ...

  7. Python3 与 C# 基础语法对比(List、Tuple、Dict、Set专栏)

      Code:https://github.com/lotapp/BaseCode 多图旧版:https://www.cnblogs.com/dunitian/p/9156097.html 在线预览: ...

  8. Luogu--3381 【模板】最小费用最大流

    题目链接 3381 [模板]最小费用最大流 手写堆版本 dijkstra   400+ms 看来优先队列的常数好大 #include<bits/stdc++.h> using namesp ...

  9. windows蜜汁调音

    哈,用的蜂鸣器,我静音了这东西还放. 只能调的很垃圾,但是很好玩. #include<cstdio> #include<windows.h> using namespace s ...

  10. A1146. Topological Order

    This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topol ...