`
yuancihang
  • 浏览: 141825 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

Java网络编程三 非阻塞通信TCP

阅读更多

 

1. nio服务端


import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Socket;
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.util.Set;

public class NioTcpServer {

    public static void main(String[] args) {
        try {
            Selector selector = Selector.open();
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            // 将其设为non-blocking状态,这样才能进行异步IO操作
            serverSocketChannel.configureBlocking(false);   
            serverSocketChannel.socket().setReuseAddress(true);
            serverSocketChannel.socket().bind(new InetSocketAddress(1000));
           
            // 将ServerSocketChannel注册到Selector上,返回对应的SelectionKey
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); //ServerSocketChannelImpl
           
            final int PACKAGE_SIZE = 10;
            ByteBuffer readBuff= ByteBuffer.allocate(1024);
            while(true){
                int n = selector.select();
                if(n == 0){
                    continue;
                }
                Set<SelectionKey> readyKeys = selector.selectedKeys();
                for(SelectionKey key : readyKeys){
                    readyKeys.remove(key);

                    if(key.isAcceptable()){
                        ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
                        SocketChannel sc = ssc.accept();
                        sc.configureBlocking(false);
                        sc.register(selector, SelectionKey.OP_READ);
                        key.interestOps(SelectionKey.OP_ACCEPT);
                    }
                    if(key.isReadable()){
                        SocketChannel clientChannel = (SocketChannel)key.channel();
                        Socket client = clientChannel.socket();
                        clientChannel.read(readBuff);
                        key.interestOps(SelectionKey.OP_READ);
                       
                        System.out.println("client ----> IP: " + client.getInetAddress().getHostAddress() + ", port: " + client.getPort());
                        if(readBuff.position() >= PACKAGE_SIZE){
                            readBuff.flip();
                            DataInputStream dis = new DataInputStream(new ByteArrayInputStream(readBuff.array()));
                            System.out.println(dis.readInt());
                            BufferedReader d = new BufferedReader(new InputStreamReader(dis));
                            System.out.println(d.readLine());
                           
                            key.cancel();
                            key.channel().close();
                           
                            readBuff.clear();
                        }else{
                            clientChannel.register(selector, SelectionKey.OP_READ);
                        }
                       
                    }//if
                   
                }
            }
           
            //关闭一个已经注册的SelectableChannel需要两个步骤
            //1. 取消注册的key,这个可以通过SelectionKey.cancel方法,也可以通过SelectableChannel.close方法,或者中断阻塞在该channel上的IO操作的线程来做到
            //2. 后续的Selector.selectXXX方法的调用才真正地关闭本地Socket
            //如果在取消SelectionKey后没有调用到selector的select方法, 那么本地socket将进入CLOSE-WAIT状态(等待本地Socket关闭).
//            serverSocketChannel.close();
//            selector.selectNow();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

 

2. 客户端可以使用《Java网络编程一 TCP通信》中的客户端程序来连接此NIO服务端测试。

分享到:
评论

相关推荐

    Java网络编程(第三版)中文版.part09.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part11.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part06.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part07.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part01.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part03.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part02.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part04.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part05.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part10.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part13.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part12.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part08.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)高清中文版.part01.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java socket 大文件传输,快速传输(包的分片,组装)源码

    java socket 大文件传输,快速传输, 数据包的分片,组装,涉及UDP,TCP传输技术,NIO非阻塞等等,适合对socket编程进一步学习的同学

    java开源包11

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包6

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包4

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

Global site tag (gtag.js) - Google Analytics