`

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上的程序修改而成

    java NIO socket聊天

    java NIO 高性能 socket通讯,服务端采用单线程,降低了cpu的压力,普通io socket通讯,server需要每个连接运行个线程,容易出现问题,效率也低

    java nio教程pdf

    信息来自http://ifeve.com/server-socket-channel/ Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从...

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

    本篇文章主要介绍了Java使用NioSocket手动实现HTTP服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

    java解读NIOSocket非阻塞模式.zip

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

    Java NIO原理和使用

    Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,...

    Java应用服务器Java-Nio-Services.zip

    JAVA服务器基于JAVA NIO I. 实现HTTP协议 II. 实现HTTPS协议 III. 实现FASTCGI协议(Client端) 运行HTTP/HTTPS服务器 运行开发包下jar文件 java -jar http-server-version-{version}.jar   ...

    Java NIO 聊天室 JSwing

    import java.nio.channels.SocketChannel; import java.util.Iterator; import com.nio.user.ClientUser; import com.nio.user.ClientUserManager; import com.nio.user.UserData; public class NIOClient { ...

    apache mina socket实例

    mina简单示例,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速...

    封闭式Java Socket代码

    封闭式Java Socket代码,提供TCP UDP 阻塞和非阻塞的方法,无需知道具体实现方式,只需要Main.java(Server)Main2.java(Client)Main(UDP)三个例程,简单建立联接。SocketIO接口提供精简化的方法,一体化输入输出,...

    基于naga开发的TCP客户端/服务器程序

    public void newConnection(NIOSocket nioSocket) { // 可在此处添加处理事件 } public void serverSocketDied(Exception exception) { // 关闭serverSocket处理 } }...

    SimpleSocketServer:Java IO | NIO样本

    SimpleSocketServer Java IO | NIO样本使用Java IO和NIO设置自己的Socket Server(待办事项) 深入了解Tomcat和Jetty的实现方式(希望如此)

    Apache Mina Server 2.0 参考手册

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    Apache-Mina-Server-2.0中文参考手册V1.0.docx

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP协议栈的通信...学习本文档,需要你已掌握 JAVA IO、JAVA NIO、JAVA Socket、JAVA 线程及并发库(java.util.concurrent.*)的知识。

    scala-nio-server:Scala中的一个Nio服务器示例

    在该项目中,我使用java选择器接口来实现一个简单的Nio Server。 用 运行src/main/scala/test/Server.Scala ,您在localhost:1237中运行服务器。 然后运行src/main/java/test/SocketClientExample.java ,运行与...

    Android-netty和socket通信的demo

    Netty是基于Java NIO client-server的网络应用框架,使用Netty可以快速开发网络应用

    协议socket通讯JAVA Spring Boot对接.rar

    Socket 通信是 Client/Server 模型 而网络通信的本质是网络间的数据 IO,这又牵扯出了 BIO 和 NIO这两个通讯模型: 2. IO通讯模型 只要有 IO,就会有阻塞或非阻塞的问题,无论这个 IO 是网络的,还是硬盘的。原因...

    java7帮助文档

    The directory &lt;Java home&gt;/sample/nio/chatserver/ contains samples that demonstrate the new APIs contained in the java.nio.file package. The directory &lt;Java home&gt;/demo/nio/zipfs/ contains samples that...

Global site tag (gtag.js) - Google Analytics