`
fokman
  • 浏览: 242190 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java nio Server实现

阅读更多

Java NIO 提供了反应堆模式非阻塞的Socket通信,代码很简单

public class TcpServer implements Runnable {
	
	private ServerSocketChannel socketChannel;
	private Selector selector;
	private int activeSockets;
	private int port;
	
	public TcpServer(){
		activeSockets = 0;
		port = 9999;
		try {
			socketChannel = ServerSocketChannel.open();
			selector = Selector.open();
			ServerSocket socket = socketChannel.socket();
			socket.bind(new InetSocketAddress(port));
			socketChannel.configureBlocking(false);
			socketChannel.register(selector, SelectionKey.OP_ACCEPT);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		while(true){
			try {
				selector.select();
			} catch (IOException e) {
				continue;
			}
			Set<SelectionKey> keys = selector.selectedKeys();
			activeSockets = keys.size();
			if(activeSockets==0){
				continue;
			}
			
			for(SelectionKey key:keys){
				if(key.isAcceptable()){
					doServerSocketEvent(key);
					continue;
				}
				if(key.isReadable()){
					doClientReadEvent(key);
					continue;
				}
				if(key.isWritable()){
					doClientWriteEvent(key);
					continue;
				}
			}
		}
	}

	private void doServerSocketEvent(SelectionKey key) {
		SocketChannel client = null;
		ServerSocketChannel server = (ServerSocketChannel)key.channel();
		try {
			client = server.accept();
			if(client == null){
				return;
			}
			client.configureBlocking(false);
			client.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
		} catch (IOException e) {
			try {
				client.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}

	private void doClientWriteEvent(SelectionKey key) {
		SocketChannel socketChannel = (SocketChannel)key.channel();
		ByteBuffer buffer = ByteBuffer.allocate(10);
		byte[] data = "0000000000".getBytes();
		buffer.put(data);
		buffer.flip();
		try {
			socketChannel.write(buffer);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void doClientReadEvent(SelectionKey key) {
		ByteBuffer receiveBuffer;
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		SocketChannel socketChannel = (SocketChannel)key.channel();
		if(socketChannel.isOpen()){
			int nBytes = 0;
			buffer.clear();
			try {
				nBytes = socketChannel.read(buffer);
			} catch (IOException e) {
				e.printStackTrace();
			}
			buffer.flip();
			if (nBytes > 0) {
				receiveBuffer = ByteBuffer.allocate(nBytes);
				receiveBuffer.clear();
				buffer.get(receiveBuffer.array());
				receiveBuffer.flip();
			}
		}
	}

	public static void main(String[] args) {
		TcpServer server = new TcpServer();
		new Thread(server).start();
	}
}
 
分享到:
评论

相关推荐

    java nio im(server+client)

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,相对于传统的BIO( Blocking I/O)模型,NIO在处理高并发、大数据量的网络应用时表现出更高的效率和...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/...以上就是Java NIO的基本概念和工作流程,以及结合文件名推测的`NIOServer.java`和`NIOClient.java`可能实现的功能。学习和理解NIO,对于开发高并发、高性能的Java应用至关重要。

    NioServer.java

    NioServer.java

    Ioserver java Nio socket 框架

    Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!

    nioserver.zip_NIO_event driven java_java nio_java nioserv_nioser

    标题中的“nioserver.zip_NIO_event driven java_java nio_java nioserv_nioser”表明这是一个关于Java NIO的服务器实现,且是基于事件驱动模式的。事件驱动编程是一种设计模式,它允许程序对特定事件做出响应,而...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    在这个场景下,Java NIO能够帮助服务器有效地处理多个客户端连接,并实现客户端之间消息的互发。 首先,我们要理解Java NIO的基本组件。主要包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是...

    一个java NIO的例子

    本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何使用NIO进行网络通信。下面我们将深入探讨Java NIO的关键组件和工作原理。 1. **通道(Channel)**:通道是数据传输的途径,类似于传统的...

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    Java NIO原理 图文分析及代码实现

    new NIOServer().initServer(8888); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码展示了如何使用Java NIO实现一个简单的服务端。在这个例子中,我们创建了一个`ServerSocketChannel`,...

    基于java NIO的socket通信demo

    首先,我们来看`NioServer.java`。这个文件中包含了一个基于NIO的服务器端实现。服务器的核心组件是`Selector`,它允许一个单独的线程监听多个套接字通道的状态变化。当客户端发起连接请求时,服务器会注册`...

    NIOServer

    【标题】:“NIOServer”是一个关于网络编程的Java实现,它使用了Java的非阻塞I/O(Non-blocking I/O,NIO)技术。在Java中,NIO是一种替代传统阻塞I/O(BIO)模型的方式,提供了更高效的数据传输能力。此项目可能是...

    nioserver.rar_NIO_java nio

    NIO(Non-blocking Input/Output)是Java编程语言中的一种I/O模型,它与传统的阻塞I/O(BIO)模型相比,具有更高的性能和更灵活的架构。NIO在Java 1.4版本中引入,全称为New Input/Output,它的核心在于“非阻塞”二...

    java nio socket 例子

    本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成

    java nio and reactor

    java nio 作者的ppt。 How to Build a Scalable ...文中讲述如何使用java nio来实现高性能的服务器。 1、建立高性能服务器遇到问题? 2、java nio 和 reactor 的映射关系 3、如果使用java nio 来实现高性能服务器

    java nio聊天室源码

    Java NIO(New IO)是Java 1.4版本引入的一种新的I/O API,它提供了非阻塞I/O操作的能力,极大地提升了Java在处理网络通信和文件读写时的性能。在这个“java nio聊天室源码”项目中,我们可以看到如何使用NIO构建一...

    java io 与java nio区别

    在给定的部分代码示例中,可以看到一个简单的Java IO Echo Server实现。这个例子展示了如何使用传统的Java IO来实现一个服务器端的应用程序,它可以接收客户端发送的消息,并将接收到的信息原样返回给客户端。这里...

    JAVA NIO 异步通信模板服务端

    例如,可能有一个名为`NioServer`的主类,用于初始化ServerSocketChannel,注册选择器,以及处理接收到的连接和数据。还有可能包含`ThreadPool`类,用于管理线程池,以及`BufferHandler`类,负责处理缓冲区中的数据...

    Java NIO原理解析

    Java NIO,即Non-Blocking I/O,是Java在JDK 1.4引入的一套新的I/O API,旨在提供一种更加高效的方式来处理I/O操作,尤其是对于网络编程和高并发场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器...

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 ...4,修改封装http做成短连接处理,就是一个小型的webserver,或者结合java2D和robot做远程监控 5,封装自己的协议可以做成自己需要的服务器端程序,

    java NIO 学习 聊天室程序 (3)

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,是对传统IO模型的重大改进。在传统的IO模型中,数据传输基于字节流或字符流,使用阻塞IO,即当读写操作进行时,如果数据没有准备好,线程会被阻塞,直到数据准备...

Global site tag (gtag.js) - Google Analytics