`
michael.softtech
  • 浏览: 208426 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java Bio与Nio通信方式小例子

阅读更多

哎,昨晚又加班。可是还是很准时的醒了....上午不用去公司,正好继续补全我的博客:)

 

大家都知道自从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();
}
}
 
分享到:
评论
6 楼 flykarry 2014-12-24  
说半天让我感觉NIO除了复杂了就没别的优点了
5 楼 fei33423 2014-12-19  
   //最初的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)); 
             
        } 
    } 

感谢楼主这段代码.
你这段代码是对传统阻塞socket一个简洁明了的示范.但是并没有展示实际中的使用方式.

进一步研究,让我对scoket编程更理解了.
1.ss.accept();是一次性的. 一个客户端连接服务端只能产生一个socket.
下次死循环时无法重复得到

2.每次客户端发送的请求,都会在inputStream里,如果发送的个数大于 buf的大小. 应该死循环读取. 而不是这个代码里只读一次,死循环去accept,这个演示代码里的的一个用户连接只会被读取一次,不管是否读取完整.

如下文章比较好的展示了传统socket在实际中的使用方式:
http://jiewo.iteye.com/blog/1562168
最近做SSO的项目,其中用到了socket长连接.一直都是看代码的,但是要求socket做成SSL的,不得不动手写写代码了.
4 楼 ooo456mmm 2014-04-23  
   
3 楼 ooo456mmm 2014-04-23  
嗯,这个主要是讲了一下具体用法。
2 楼 michael.softtech 2011-04-21  
呵呵,基本的概念是没说。
这个主要是举一个例子说明一下各自大致的用法。
1 楼 njutzyg 2011-04-06  
说了半天,也没看到NIO和BIO有啥区别

相关推荐

    实现java网络与nio例子

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了程序处理高并发I/O操作的效率。这个例子包含了NIO在网络通信中的应用,...

    JAVA nio的一个简单的例子

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种I/O模型,旨在提供一种更高效、更具弹性的I/O处理方式。相比于传统的BIO( Blocking I/O)模型,NIO在处理高并发和大...

    java nio im(server+client)

    在这个Java NIO IM(即时通讯)服务器和客户端的示例中,我们将探讨如何利用NIO进行双向通信,并理解其背后的机制。 1. **NIO基础概念** - **通道(Channel)**:在NIO中,数据是通过通道进行传输的。通道类似于流...

    ssh.rar_NIO_java nio

    Java NIO,全称为New Input/Output,是Java在JDK 1.4版本引入的一套全新的I/O API,是对传统BIO(Blocking I/O)模型的补充和扩展。NIO提供了一种不同于传统阻塞I/O的处理数据的方式,其核心特点是非阻塞和选择器,...

    服务端以NIO的方式处理请求的Demo

    在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,相较于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输方式,尤其适用于高并发、低延迟的场景。本Demo展示了如何在服务端...

    java解读NIOSocket非阻塞模式宣贯.pdf

    Java NIO(Non-blocking Input/Output)是一种在Java中实现高效I/O操作的方式,与传统的BIO( Blocking I/O)模型相比,它显著地减少了线程的使用,从而减轻了线程管理的开销,提高了系统的并发能力。NIO的核心组件...

    socket编程例子

    在这个例子中,我们关注的是使用Non-blocking I/O(NIO)的Socket通信,这是一种提高性能和效率的方式,因为它允许单个线程处理多个连接。 在Java中,Socket接口代表了网络上的两个应用程序间的双向通信链路。而NIO...

    java72-java-advance源代码.zip

    3. **IO/NIO/BIO**:Java的输入输出流、非阻塞I/O和生物I/O在处理文件、网络通信时非常关键,源码可能包含这些技术的应用。 4. **反射**:Java反射机制允许程序在运行时动态地获取类的信息并调用其方法,源码中可能...

    java 之异步套接字编程实例(AIO)

    在Java AIO中,核心类库包括`java.nio.channels`包下的`AsynchronousSocketChannel`和`AsynchronousServerSocketChannel`,它们分别用于异步客户端和服务器端的通信。与传统的BIO( Blocking I/O)不同,AIO的读写...

    nio-demo:NIO编辑演示

    **NIO(New Input/Output)是Java提供的一种非阻塞I/O模型,与传统的BIO(Block I/O)相比,NIO具有更高的并发性能,尤其适用于处理大量连接的服务器端应用。本项目"nio-demo"是针对NIO编程的一个演示,通过一系列...

    groupchat.zip

    在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,它与传统的BIO(Blocking I/O)模型相比,具有更高的并发性能,尤其适用于处理大量的并发连接,比如群聊系统。"groupchat.zip...

    构建高性能的大型分布式java应用

    - **BIO、NIO与AIO**:阻塞IO (BIO) 是最基本的IO操作模型,读写操作都是同步的;非阻塞IO (NIO) 提供了异步读取的能力,但写操作仍然是同步的;而异步IO (AIO) 则实现了真正的异步读写,大大提高了系统的并发能力。...

    core-code-project

    6. **IO/NIO/BIO**:Java的IO模型包括传统的 Blocking IO (BIO)、Non-blocking IO (NIO) 和 New IO (NIO.2)。理解这些模型对于处理输入输出操作至关重要,项目可能涵盖这三者的实际应用。 7. **异常处理**:在Java...

    ExemplesCours:我在教学课程中使用的示例(以法语记录)

    9. **IO/NIO/BIO**:Java I/O流的使用,非阻塞I/O(NIO)的概念和应用。 10. **反射机制**:动态获取类信息,创建对象,调用方法等。 11. **注解**:元数据的使用,自定义注解及其处理器。 12. **JVM内存模型**:...

    详解Tomcat如何实现Comet

    Tomcat实现Comet模式,通常依赖于非阻塞IO(NIO)技术,而不是传统的阻塞IO(BIO)。NIO技术允许服务器在等待IO操作完成的同时处理其他任务,这对于需要长时间保持连接并响应各种事件的Comet模式来说,是非常合适的...

Global site tag (gtag.js) - Google Analytics