Java中的非阻塞IO解决方案

时间:2015-05-01 14:34:57

标签: java multithreading ssl io buffer

我正在编写一个使用多个SSL连接的程序。基本上,我的代码必须有3个独立的程序,它们可以相互连接并通过SSL套接字进行通信。

我遇到的问题是阻止I / O.例如,我的类CLAFrame.java必须能够检测和处理流的输入,但也能够执行其他功能。我不希望这会阻止整个程序并冻结它等待输入(就像现在一样)。

这是我如何设置的。

 static void initializeCLAConnection(){
        try {
            SSLServerSocketFactory sslserversocketfactory =
                    (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
            SSLServerSocket sslserversocket =
                    (SSLServerSocket) sslserversocketfactory.createServerSocket(3577);
            SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();


            InputStream inputstream = sslsocket.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);


            OutputStream outputstream = sslsocket.getOutputStream();
            OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
            BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);


            input=bufferedreader;
            output=bufferedwriter;
            System.out.println("Connection accepted from: "+sslserversocket.getInetAddress());


         String string=null;

         //RECEIVING INPUT
         while(input.ready()){
             System.out.println("CLA receiving msg");

        // while ((string = input.readLine()) != null) {
             string=input.readLine();
             System.out.println(string);
             /*
              * HEADERS FOR INPUT RECEIVED
              * Format: VAL Ryan Smith
              * VAL - requesting validation id
        */    

             String header=null;
             String rest=null;
             header=string.substring(0, 3);
             if(string.length()>3){
             rest=string.substring(4, string.length()-1);
             }
             //perform actions based on input
             switch(header){
             case "VAL ":
                 //do something
                 requestValidationID(rest);
                 break;
             default:
                 break;
             }

         } 

        }

          //  System.out.println("Successfully established CLA server on SSL port 3577");
         catch (Exception exception) {
                exception.printStackTrace();
            }
    }

注意 - 以前,我将我的while循环设置为     while((string = input.readLine())!= null){

但是,显然这将阻止I / O直到收到输入。然后我切换到了     而(input.ready()){ 这已经停止了阻塞,但是当我写入流时,我的缓冲区(输入)根本没有收到任何内容。

有更好的方法吗?这个程序设置为GUI,所以我需要缓冲区才能接收输入,但我还需要能够同时使用程序上的其他按钮和功能,而不会阻塞所有内容。

我应该让它多线程吗?用于读取缓冲区的线程和用于所有其他函数的线程?我有点困惑,接下来要尝试什么。 非常感谢任何意见/建议,谢谢!

1 个答案:

答案 0 :(得分:2)

你试图在这里重新发明轮子。有许多非阻塞框架,都建立在Java NIO之上(它在Java中提供非阻塞IO功能)。

Netty就是这样一个例子,非常快,而不是最高的抽象。

编辑: 考虑到这是一个学校项目,你只需要能够同时做事,我说你想要的不是非阻塞代码,你只是希望你的阻止代码在一个单独的代码中运行线。 请参阅Java的Executors

相关问题