gpt4 book ai didi

java - Java中的非阻塞IO解决方案

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:40 24 4
gpt4 key购买 nike

我正在编写一个使用多个 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,直到接收到输入。然后我切换到 而(输入。准备好()){这已经停止了阻塞,但现在当我写入流时,我的缓冲区(输入)根本没有收到任何东西。

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

我应该让它成为多线程吗?一个用于读取缓冲区的线程和另一个用于所有其他功能的线程?我有点困惑接下来要尝试什么。任何输入/建议将不胜感激,谢谢!

最佳答案

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

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

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

关于java - Java中的非阻塞IO解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29988878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com