哎,昨晚又加班。可是还是很准时的醒了....上午不用去公司,正好继续补全我的博客:)
大家都知道自从jdk5开始,java中多了java.nio和java.util.concurent包,这两个包
可谓威力无穷啊,像tomcat最新版本(用了concurrent包),mina等纷纷在此基础上进行了
更新(mina更是直接就通过java.nio来实现的)。
其实nio说起来很简单。
java通信的基础是socket.和serversocket 在此基础上封装一下,就是socketchannel和serversocketchannel,
封装成channel的最大好处就是可以实现non-blocking的通信。然后再加入了一个多路轮询机制,通过观察者模式
使得通过单线程就可以同时管理多个channel. 明白了这些之后,放出我的例子来。分别使用socket,channel,selector
实现了java的通信。
坦白讲,在写这些代码之前我对channel,selector等的概念还是比较模糊的。
写完之后清晰多了:实际上就是对java socket通讯的一种优化手段。
Server:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Set;
public class TestChannel {
public static void main(String args[]) throws IOException{
TestChannel tt=new TestChannel();
//tt.initServerChannel(992);
tt.initSelector(992);
}
//最初的java socket实现方式,直接通过serversocket和socket通信
public void initServerSocket(int port) throws IOException{
ServerSocketChannel ssc=ServerSocketChannel.open();
//ssc.configureBlocking(false);
ServerSocket ss=new ServerSocket(port);
while(true){
Socket socket=ss.accept();
System.out.println("socket accepted");
byte[] buf=new byte[1024];
try{
socket.getInputStream().read(buf);
}
catch(Exception ex){
socket.close();
}
System.out.println(new String(buf));
}
}
//通过Channel实现的non-blocking通信方式
public void initServerChannel(int port) throws IOException{
ServerSocketChannel ssc=ServerSocketChannel.open();
ssc.configureBlocking(false);
ServerSocket ss=ssc.socket();
ss.bind(new InetSocketAddress(port));
while(true){
SocketChannel sc=ssc.accept();
if(sc!=null){
Socket socket=sc.socket();
System.out.println("socket accepted");
byte[] buf=new byte[1024];
try{
socket.getInputStream().read(buf);
}
catch(Exception ex){
socket.close();
}
System.out.println(new String(buf));
}
}
}
//通过selector和channel进行multiplexed通信,像mina就是通过这种方式实现的
public void initSelector(int port) throws IOException{
Selector selector=Selector.open();
//register server channel
ServerSocketChannel ssc=ServerSocketChannel.open();
ssc.configureBlocking(false);
ServerSocket ss=ssc.socket();
ss.bind(new InetSocketAddress(port));
ssc.register(selector, SelectionKey.OP_ACCEPT);
while(true){
int interestNo=selector.select();
if(interestNo==0)
continue;
Set<SelectionKey> keys=selector.selectedKeys();
for(SelectionKey key:keys){
//接受Socket连接请求
if(key.isAcceptable()){
SocketChannel sc=ssc.accept();
try{
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
}
catch(Exception ex){
sc.close();
}
System.out.println("connection accepted");
keys.remove(key);
}
else if(key.isReadable()){
SocketChannel sc=(SocketChannel)key.channel();
ByteBuffer bbuf=ByteBuffer.allocate(1024);
try{
sc.read(bbuf);
}
catch(Exception ex){
sc.close();
}
System.out.println(new String(bbuf.array()));
keys.remove(key);
}
else
keys.remove(key);
continue;
}
}
}
}
client:
public class TestChannelClient {
public static void main(String args[]) throws UnknownHostException, IOException{
Socket sc=new Socket("127.0.0.1",992);
OutputStream out=sc.getOutputStream();
out.write("hello".getBytes());
out.flush();
}
}
分享到:
相关推荐
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了程序处理高并发I/O操作的效率。这个例子包含了NIO在网络通信中的应用,...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种I/O模型,旨在提供一种更高效、更具弹性的I/O处理方式。相比于传统的BIO( Blocking I/O)模型,NIO在处理高并发和大...
在这个Java NIO IM(即时通讯)服务器和客户端的示例中,我们将探讨如何利用NIO进行双向通信,并理解其背后的机制。 1. **NIO基础概念** - **通道(Channel)**:在NIO中,数据是通过通道进行传输的。通道类似于流...
Java NIO,全称为New Input/Output,是Java在JDK 1.4版本引入的一套全新的I/O API,是对传统BIO(Blocking I/O)模型的补充和扩展。NIO提供了一种不同于传统阻塞I/O的处理数据的方式,其核心特点是非阻塞和选择器,...
在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,相较于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输方式,尤其适用于高并发、低延迟的场景。本Demo展示了如何在服务端...
Java NIO(Non-blocking Input/Output)是一种在Java中实现高效I/O操作的方式,与传统的BIO( Blocking I/O)模型相比,它显著地减少了线程的使用,从而减轻了线程管理的开销,提高了系统的并发能力。NIO的核心组件...
在这个例子中,我们关注的是使用Non-blocking I/O(NIO)的Socket通信,这是一种提高性能和效率的方式,因为它允许单个线程处理多个连接。 在Java中,Socket接口代表了网络上的两个应用程序间的双向通信链路。而NIO...
3. **IO/NIO/BIO**:Java的输入输出流、非阻塞I/O和生物I/O在处理文件、网络通信时非常关键,源码可能包含这些技术的应用。 4. **反射**:Java反射机制允许程序在运行时动态地获取类的信息并调用其方法,源码中可能...
在Java AIO中,核心类库包括`java.nio.channels`包下的`AsynchronousSocketChannel`和`AsynchronousServerSocketChannel`,它们分别用于异步客户端和服务器端的通信。与传统的BIO( Blocking I/O)不同,AIO的读写...
**NIO(New Input/Output)是Java提供的一种非阻塞I/O模型,与传统的BIO(Block I/O)相比,NIO具有更高的并发性能,尤其适用于处理大量连接的服务器端应用。本项目"nio-demo"是针对NIO编程的一个演示,通过一系列...
在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,它与传统的BIO(Blocking I/O)模型相比,具有更高的并发性能,尤其适用于处理大量的并发连接,比如群聊系统。"groupchat.zip...
- **BIO、NIO与AIO**:阻塞IO (BIO) 是最基本的IO操作模型,读写操作都是同步的;非阻塞IO (NIO) 提供了异步读取的能力,但写操作仍然是同步的;而异步IO (AIO) 则实现了真正的异步读写,大大提高了系统的并发能力。...
6. **IO/NIO/BIO**:Java的IO模型包括传统的 Blocking IO (BIO)、Non-blocking IO (NIO) 和 New IO (NIO.2)。理解这些模型对于处理输入输出操作至关重要,项目可能涵盖这三者的实际应用。 7. **异常处理**:在Java...
9. **IO/NIO/BIO**:Java I/O流的使用,非阻塞I/O(NIO)的概念和应用。 10. **反射机制**:动态获取类信息,创建对象,调用方法等。 11. **注解**:元数据的使用,自定义注解及其处理器。 12. **JVM内存模型**:...
Tomcat实现Comet模式,通常依赖于非阻塞IO(NIO)技术,而不是传统的阻塞IO(BIO)。NIO技术允许服务器在等待IO操作完成的同时处理其他任务,这对于需要长时间保持连接并响应各种事件的Comet模式来说,是非常合适的...