我正在编写一个使用多个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,所以我需要缓冲区才能接收输入,但我还需要能够同时使用程序上的其他按钮和功能,而不会阻塞所有内容。
我应该让它多线程吗?用于读取缓冲区的线程和用于所有其他函数的线程?我有点困惑,接下来要尝试什么。 非常感谢任何意见/建议,谢谢!