`

java nio socket server

    博客分类:
  • Java
阅读更多
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 config.ServerConfig;

/**
 * NIO 非阻塞 服务器
 * @author zhangzuoqiang
 * <br/>Date: 2011-3-5
 */
public class NIOServer {
	
	public static void main(String[] args) throws Exception{
		// 创建本地Socket信道.并设为非阻塞方式
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.socket().bind(new InetSocketAddress(ServerConfig.LISTENNING_PORT));
        serverChannel.configureBlocking(false);
        
        // 创建选择器(异步 I/O 中的核心对象),并将其注册到serverChannel
        Selector selector = Selector.open();
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);//监听 accept 事件
        
        while (true) {
        	if (selector.select(ServerConfig.CONNECT_TIMEOUT) == 0) {
        		 System.out.println("waiting...");
                 continue;
			}
        	
        	// 获得就绪信道的键迭代器
            Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
            
            // 使用迭代器遍历就绪信道
            while (keyIter.hasNext()) {
            	 SelectionKey key = keyIter.next();
            	// 若有客户端连接,则准备一个clientChannel与之通信
    			if (key.isAcceptable()) {
    				SocketChannel clientChannel = ((ServerSocketChannel)key.channel()).accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(ServerConfig.BUFFER_SIZE));
    			}
    			
    			try {
    				// 客户端有写入时
        			if (key.isReadable()) {
        				// 获得与客户端通信的信道
                        SocketChannel clientChannel = (SocketChannel)key.channel();
                        // 得到并重置缓冲区的主要索引值
                        ByteBuffer buffer = (ByteBuffer)key.attachment();
                        buffer.clear();
                        // 读取信息获得读取的字节数
                        long bytesRead = clientChannel.read(buffer);
                        if(bytesRead == -1){// 没有读取到内容的情况
                        	clientChannel.close();
                        }else{
                        	// 将缓冲区准备为数据传出状态
                            buffer.flip();
                            
                            // 将获得字节字符串(使用Charset进行解码)
                            String receivedString = Charset.forName(ServerConfig.LOCAL_CHARSET).newDecoder().decode(buffer).toString();
                            System.out.println("接收到信息:" + receivedString);
                            
                            //接收到客户端的请求之后,将策略文件发送出去
                            if(receivedString.indexOf("<policy-file-request/>") >=0){
                            	String policyStr = ServerConfig.POLICY_XML + "\0";
                            	buffer = ByteBuffer.wrap(policyStr.getBytes(ServerConfig.LOCAL_CHARSET));
                            	clientChannel.write(buffer);
                            }
                            
                            // 准备发送的文本
                            String sendString = "你好,客户端. 已经收到你的信息" + receivedString;
                            // 将要发送的字符串编码(使用Charset进行编码)后再进行包装
                            buffer = ByteBuffer.wrap(sendString.getBytes(ServerConfig.LOCAL_CHARSET));
                            // 发送回去
                            clientChannel.write(buffer);
                            
                            // 设置为下一次读取或是写入做准备
                            key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
                          }
        			}
				} catch (Exception e) {
					// TODO: 当客户端在读取数据操作执行之前断开连接会产生异常信息
					e.printStackTrace();
                    //将本socket的事件在选择器中删除
                    key.cancel();
                    break;
				}finally{
					// 删除处理过的 SelectionKey
	    			keyIter.remove();
				}    			
    		}
		}
        
	}
}
 
分享到:
评论

相关推荐

    Ioserver java Nio socket 框架

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

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...

    java nio socket 例子

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

    NioSocket,包括server端和client端

    NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...

    基于java NIO的socket通信demo

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

    Java Socket学习---nio实现阻塞多线程通信

    在Java编程领域,Socket是网络通信的基础,它允许两个或多个应用程序通过TCP/IP协议进行数据交换。本篇文章将深入探讨如何使用Java NIO(非阻塞I/O)来实现阻塞多线程通信,这对于高性能服务器端应用尤其重要。我们...

    Java使用NioSocket手动实现HTTP服务器

    NioSocket是Java的New I/O(Non-blocking I/O)API,提供了非阻塞式的I/O操作,可以提高服务器的性能和可扩展性。 在这个示例中,我们首先创建了一个ServerSocketChannel,用于监听客户端的请求。然后,我们将...

    socket通信NIO代理模式demo实例

    在"socket通信NIO代理模式demo实例"中,你可以找到具体的代码实现,包括`Server`端和`Client`端的逻辑,以及如何使用`Selector`进行事件监听。通过对这个示例的学习,你可以深入理解NIO在代理模式中的应用,并能灵活...

    java_Nio_server_and_j2me_client.rar_J2ME SERVER_NIO_j2me_j2me ni

    标题中提到的"java_Nio_server_and_j2me_client.rar"是一个包含Java NIO服务器和J2ME客户端的应用示例。J2ME(Java Micro Edition)是Java平台的一个子集,主要用于移动设备和嵌入式设备。在这个项目中,NIO服务器...

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

    ### Java NIO原理 图文分析及代码实现 #### 前言 在深入探讨Java NIO之前,我们先简要回顾一下NIO的概念及其引入的原因。随着互联网的发展,越来越多的应用程序需要处理高并发的网络连接请求。传统的阻塞I/O模型在...

    java io 与java nio区别

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

    JAVA NIO 异步通信模板服务端

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

    java解读NIOSocket非阻塞模式.zip

    client多线程请求server端,server接收client的名字,并返回Hello!+名字的字符格式给client。当然实际应用并不这么简单,实际可能是访问文件或者数据库获取信息返回给client。非阻塞的NIO有何神秘之处?直接上代码...

    nio socket编程java代码示例,客户端发送消息,服务端接收

    本示例将详细解析如何使用Java的非阻塞I/O(NIO)实现Socket通信,包括客户端发送消息和服务器端接收消息的过程。 首先,理解NIO(Non-blocking Input/Output)的概念至关重要。NIO与传统的IO模型不同,它提供了对...

    JAVA+Socket教程

    4. **NIO(非阻塞I/O)**:Java NIO库提供了非阻塞的I/O操作,适用于高并发的Socket通信场景。 5. **缓冲区管理**:使用ByteBuffer等NIO类可以更有效地管理内存缓冲区,提高性能。 以上内容只是Java Socket编程的...

    Mina NIO Socket

    在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket的核心概念、工作原理以及在实际项目中...

    Socket编程QQ实现 JAVA

    - `Selector`和`SelectableChannel`是Java NIO的一部分,可用于高效地监控多个Socket通道的状态。 通过以上步骤,你可以构建一个简单的基于Socket的QQ聊天模拟器。然而,实际的QQ客户端和服务器会涉及到更复杂的...

    Java源码:Socket编程.rar_java socket _java编程_socket java_socket编程 jav

    在Java Socket编程中,我们还可以使用NIO(Non-blocking I/O)进行更高效的并发处理。NIO提供了选择器(Selector)和通道(Channel)等机制,可以在单线程下处理多个Socket连接,提高了系统资源的利用率。 另外,`...

    java nio Selector的使用-客户端

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它提供了一种新的方式来处理I/O操作,相比传统的IO模型,NIO具有更好的性能和更高的效率。Selector是Java NIO中的核心组件之一,它允许单个线程处理多个通道...

Global site tag (gtag.js) - Google Analytics