`

nio 编程实例

    博客分类:
  • java
NIO 
阅读更多
1.编写服务端

package com.boce.nio.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.springframework.util.StringUtils;

public class ServerNio implements Runnable {
//选择器
private Selector selector;

private ServerSocketChannel servChannel;
//设置应答线程池
private ExecutorService exeService = Executors.newFixedThreadPool(ServerConfig.SERVER_WRITE_BOOL);

private boolean stop;

public boolean isStop() {
return stop;
}

public void setStop(boolean stop) {
this.stop = stop;
}

public ServerNio(int port) {
try {
selector = Selector.open();
servChannel = ServerSocketChannel.open();
servChannel.configureBlocking(false);
InetSocketAddress endpoint = new InetSocketAddress(port);
servChannel.socket().bind(endpoint, 1024);
//接收连接继续事件,表示服务器监听到了客户连接,服务器可以接收这个连接了
servChannel.register(selector, SelectionKey.OP_ACCEPT);

} catch (Exception e) {

}
}

@Override
public void run() {

while (!stop) {
try {
System.out.println("---------------start");
selector.select();
Set<SelectionKey> set = selector.selectedKeys();
Iterator<SelectionKey> items = set.iterator();

while (items.hasNext()) {
SelectionKey key = items.next();
items.remove();
try{
handleInput(key);

}catch(Exception ex){
if(null !=key){
key.cancel();
}

if(null != key.channel()){
key.channel().close();
}
}
}

} catch (Exception e) {
e.printStackTrace();

}


}

if (selector != null) {
try {
selector.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}




private void handleInput(final SelectionKey key) throws IOException{
if(key.isValid()){
//处理新信息
if(key.isAcceptable()){
ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
SocketChannel sc = ssc.accept();
if(null !=sc){
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
}
}
//可以读取信息了
if(key.isReadable()){
SocketChannel sc = (SocketChannel)key.channel();
//每次读取请求字节数组
ByteBuffer byteBuffer = ByteBuffer.allocate(ServerConfig.SERVER_PER_READ);
//每次请求信息
byte[] temp = new byte[ServerConfig.SERVER_TOTAL_READ];//
//合并数组的下标
int tempstart =0;
StringBuffer sb = new StringBuffer(256);
int len = -1;
while((len = sc.read(byteBuffer)) >0){
//设置byteBuffer的position 为0,从头开始读取
byteBuffer.flip();
int tLen =byteBuffer.remaining();
byte[] bytes = new byte[tLen];
//数据读入bytes数组
byteBuffer.get(bytes);
int end = tempstart+tLen;
//把bytes复制到temp
System.arraycopy(bytes,0,temp,tempstart,tLen);
tempstart = end;
//清除byteBuffer
byteBuffer.clear();
}
sb.append(new String(temp,"UTF-8"));
System.out.println("read ==>"+sb.toString());

sb.insert(0, "server is back==>");
ServerWriteHandle serverWriteHandle = new ServerWriteHandle(sc, sb.toString());
exeService.execute(serverWriteHandle);

if(len <= 0){
//关闭链端
if(null != key && key.isValid()){
key.cancel();
}
// if(null !=sc && sc.isOpen()){
// sc.close();
// }
}


}


}//isValid

}


private void writeMsg(SocketChannel sc,final String msg) throws IOException{
//模拟后台执行

try {
Random dom = new Random();
int time = dom.nextInt(300);
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


if(!StringUtils.isEmpty(msg)){
byte[] bMsg = msg.getBytes(Charset.forName("UTF-8"));
ByteBuffer byteBuffer = ByteBuffer.allocate(bMsg.length);
byteBuffer.put(bMsg);
byteBuffer.flip();

sc.write(byteBuffer);
}

}




}



package com.boce.nio.server;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Random;

import org.springframework.util.StringUtils;
/**
* 发送应答信息
* @author gjp
*
*/
public class ServerWriteHandle implements Runnable{

private SocketChannel sc;

private String msg ;



public ServerWriteHandle(SocketChannel sc, String msg) {
super();
this.sc = sc;
this.msg = msg;
}



@Override
public void run() {


try {
Random dom = new Random();
int time = dom.nextInt(30);
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


if(!StringUtils.isEmpty(msg)){
byte[] bMsg = msg.getBytes(Charset.forName("UTF-8"));
ByteBuffer byteBuffer = ByteBuffer.allocate(bMsg.length);
byteBuffer.put(bMsg);
byteBuffer.flip();

try {
sc.write(byteBuffer);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
sc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

}


package com.boce.nio.server;

/**
* nio server端通用参数
* @author gjp
*
*/
public class ServerConfig {
//写线程池数量
public static final int SERVER_WRITE_BOOL = 300;
//每次读取字节数
public static final int SERVER_PER_READ = 256;
//一次请求读取总字节数(byte)
public static final int SERVER_TOTAL_READ = 1024;
}


编写启动程序:

package com.boce.nio.server;

import java.util.concurrent.Executors;

public class ServerStart {

public static void main(String[] args) {
ServerNio serverNio = new ServerNio(9999);
Executors.newFixedThreadPool(1).execute(serverNio);
}

}



2.编写客户端:

package com.boce.nio.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class ClientNio implements Runnable {

private String host;
private int port;

private Selector selector;
private SocketChannel socketChannel;

private volatile boolean stop;

private int step;

public ClientNio(String host, int port,int step) {
try {
this.host = host == null ? "127.0.0.1" : host;
this.port = port;
this.selector = Selector.open();
this.socketChannel = SocketChannel.open();
this.socketChannel.configureBlocking(false);

this.step = step;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

@Override
public void run() {
try {
doConnect();
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}

while (!stop) {
try {
System.out.println("---------------start");
selector.select();
Set<SelectionKey> set = selector.selectedKeys();
Iterator<SelectionKey> items = set.iterator();
SelectionKey key = null;
while (items.hasNext()) {
key = items.next();
items.remove();
try {
handleInput(key);
} catch (Exception ex) {
if (null != key) {
key.cancel();
}

if (null != key.channel()) {
key.channel().close();
}
}
}

} catch (Exception e) {
e.printStackTrace();
System.exit(0);

}

}


if (selector != null) {
try {
selector.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

private void handleInput(SelectionKey key) throws IOException {
if (key.isValid()) {
SocketChannel sc = (SocketChannel) key.channel();
//如果已经连接
if(key.isConnectable()){
if(sc.finishConnect()){
sc.register(selector, SelectionKey.OP_READ);
System.out.println("----------------handleInput***************doWrite");
doWrite(sc);
}else{
System.out.println("连接失败");
System.exit(1);
}
}


if (key.isReadable()) {
// SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
int readLen = sc.read(byteBuffer);
if (readLen > 0) {
byteBuffer.flip();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);

String body = new String(bytes, "UTF-8");
System.out.println("read sever back msg :: " + body);

stop = true;

                               // 关闭链端(如果不关闭,客户端最大连接数16286,之后开始报异常)
if(null !=key){
key.cancel();
}
if(null !=sc){
sc.close();
}


} else if (readLen < 0) {
// 关闭链端
if(null !=key){
key.cancel();
}
if(null !=sc){
sc.close();
}
} else {
System.out.println("读取数据 为0");
;// 读取数据为0;忽略
}

}

} // isValid

}

private void doConnect() throws IOException {
// 如果注册成功,注册到多路选择器,发送信息,读取信息
boolean isConn = socketChannel.connect(new InetSocketAddress(host, port));
if (isConn) {
socketChannel.register(selector, SelectionKey.OP_READ);
System.out.println("doconnect .....");
doWrite(socketChannel);
} else {
socketChannel.register(selector, SelectionKey.OP_CONNECT);
}

}

private void doWrite(SocketChannel sc) throws IOException {

String send ="requst time 请求===写入客户端信息内容************************************==========================="+step;
System.out.println("发送信息:"+send);
byte[] msg = send.getBytes("UTF-8");
ByteBuffer byteBuffer = ByteBuffer.allocate(msg.length);
byteBuffer.put(msg);
String position1 ="position"+ byteBuffer.position()+";capacity="+byteBuffer.capacity()+
";limit="+byteBuffer.limit()+";mark"+byteBuffer.mark()+
";remain"+byteBuffer.hasRemaining();
System.out.println(position1);

byteBuffer.flip();
String position2 = byteBuffer.position()+";capacity="+byteBuffer.capacity()+
";limit="+byteBuffer.limit()+";mark"+byteBuffer.mark()+
";remain"+byteBuffer.hasRemaining();
System.out.println(position2);
sc.write(byteBuffer);

if (!byteBuffer.hasRemaining()) {
System.out.println(" send order 2 success");
}
}

}


客户端启动程序:
package com.boce.nio.server;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class ClientStart {

public static void main(String[] args) {
String host="127.0.0.1";
int port =9999;
AtomicInteger ac = new AtomicInteger(0);
ExecutorService exe = Executors.newFixedThreadPool(100);
for(int i=0;i<1;i++){
ClientNio client = new ClientNio(host, port,ac.getAndIncrement());
exe.execute(client);
}

exe.shutdown();

}

}


测试发送记录条数:



  • 大小: 38 KB
分享到:
评论

相关推荐

    JAVA-NIO程序设计完整实例

    本实例将深入探讨NIO的基本概念、关键组件以及如何在实际编程中应用NIO。 ### 1. NIO基本概念 - **通道(Channel)**: 通道是NIO的核心概念,它类似于流,但可以双向传输数据。常见的通道类有FileChannel、...

    NIO编程实现实例

    4. **NIO编程流程**: - 打开通道:根据需求创建FileChannel、SocketChannel或ServerSocketChannel。 - 创建缓冲区:根据需要处理的数据类型创建对应的Buffer实例。 - 读写数据:使用通道与缓冲区交互,将数据从...

    NIO实例

    标题中的"NIO实例"指的是Java中的非阻塞I/O(Non-blocking Input/Output)技术,它是Java从1.4版本开始引入的一种I/O模型,旨在提高网络编程的效率和性能。与传统的IO(BIO)相比,NIO具有异步、非阻塞的特点,能够...

    《Java网络编程实例:Java网络编程实例》

    本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点,这些知识点通常会在书中详细讨论: 1. **TCP/IP协议基础**:首先,了解TCP/IP模型和协议栈是非常...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...

    JavaNIO服务器实例Java开发Java经验技巧共6页

    本资料"JavaNIO服务器实例Java开发Java经验技巧共6页"可能是某个Java开发者或讲师分享的一份关于如何在Java中构建NIO服务器的教程,涵盖了6个关键页面的内容。尽管具体的细节无法在此直接提供,但我们可以根据Java ...

    Java NIO实例

    NIO不仅适用于网络编程,如服务器端的高并发处理,还广泛应用于文件系统操作、数据库连接池等场景。在大型分布式系统中,NIO可以帮助优化性能,提高系统的响应速度。 通过学习和掌握Java NIO,开发者可以构建出更加...

    Java基础编程实例

    Java基础编程实例是Java初学者入门的绝佳资源,它涵盖了Java语言的核心概念和技术。这个教程旨在帮助新手理解并掌握Java编程的基本元素,从而能够独立编写简单的程序。以下是一些主要的知识点: 1. **Java环境配置*...

    java网络编程实例.rar

    这个"java网络编程实例.rar"的压缩包显然包含了帮助开发者理解和实践Java网络编程的资源。让我们详细探讨一下Java网络编程的核心概念和相关知识点。 首先,Java网络编程主要基于Java的Socket编程模型,它允许程序...

    java网络编程实例2

    这个"java网络编程实例2"很可能包含了深入的实践案例,帮助读者理解并掌握网络编程的基本概念和技术。以下是根据标题和描述可能涵盖的一些关键知识点: 1. **网络基础知识**:在Java中进行网络编程首先需要了解TCP/...

    java nio 网络编程指南

    ### Java NIO网络编程核心知识点解析 #### 非阻塞式Socket通信:Java NIO的革命性突破 从JDK 1.4版本开始,Java引入了NIO(Non-blocking I/O)API,这标志着Java网络编程的一个重大转折点。传统上,基于阻塞I/O的...

    java 编程实例

    Java编程实例是学习和深化Java语言技能的重要途径。这些实例涵盖了基础到高级的各种主题,旨在帮助开发者理解并熟练掌握Java编程。以下是一些基于提供的压缩包文件“Java编程100例”可能涵盖的关键知识点: 1. **...

    一个NIO服务端,客户端的例子

    客户端则会创建Bootstrap实例,设置通道工厂,通常是NioSocketChannel。同样地,客户端也需要配置管道,其中包含一个ByteToMessageDecoder和一个ClientBusinessHandler,后者负责与服务器交互的逻辑。 在启动服务器...

    java网络编程实例

    在这个实例中,我们将深入探讨Java网络编程的基础及其在实际应用中的实践。本文将覆盖以下几个关键知识点: 1. **Java网络编程基础** - Java提供了丰富的类库支持网络编程,如`java.net`包下的Socket、...

    NIO 经典实例

    本实例将深入探讨NIO在服务器端和客户端的应用,通过`NioDemoServer.java`和`NioDemoClient.java`这两个文件来解析NIO的核心知识点。 1. **NIO基础** NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...

    socket通信NIO代理模式demo实例

    本实例"socket通信NIO代理模式demo"将展示如何利用NIO来构建一个高性能的代理服务器。 代理模式是一种设计模式,它允许我们创建一个代理对象来控制对原对象的访问。在NIO代理模式中,代理服务器作为客户端与目标...

    Java网络编程/Java网络编程实例

    Java网络编程是Java开发中的重要领域,它涵盖了网络应用...提供的《Java网络编程实例》将可能包含这些概念的具体代码示例,帮助读者更好地理解和掌握相关技术。阅读和分析这些实例,是提升Java网络编程技能的有效途径。

    Java网络编程实例

    在"Java网络编程实例1"这个压缩包中,可能包含了实际的Java代码示例,包括简单的客户端-服务器通信,多线程服务器,使用URL和URLConnection下载文件,以及可能的NIO实现。这些实例可以帮助读者更直观地理解上述理论...

    Java高并发编程代码(Netty NIO 实例)

    本实例将深入探讨Netty如何实现NIO在高并发场景下的优化和应用。 首先,让我们理解Java的NIO(Non-blocking I/O,非阻塞I/O)。传统的Java IO模型(BIO)是基于流(Stream)的,对每一个连接都需要一个线程来处理,当...

Global site tag (gtag.js) - Google Analytics