JAVA TLS套接字:bufferedreader.ready()始终为false



我想使用TLS 对小型"聊天"程序进行编程

我在SSL套接字和输入流方面遇到问题。TLS部分工作正常。

我的问题是:"bufferedreader.ready()"总是返回false。如果我删除teh if-satetmant if工作"好"。程序等待,直到出现一个或,然后将is打印到System.out。但我无法在这段时间内发送消息。

"客户端"

  InputStream inputstream = System.in;
  InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
  BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
        InputStream inputstream1 = socket.getInputStream();
        InputStreamReader inputstreamreader1 = new InputStreamReader(inputstream1);
        BufferedReader bufferedreader1 = new BufferedReader(inputstreamreader1);
        OutputStream outputstream = socket.getOutputStream();
        OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
        BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
        OutputStream outputstream1 = System.out;
        OutputStreamWriter outputstreamwriter1 = new OutputStreamWriter(outputstream1);
        BufferedWriter bufferedwriter1 = new BufferedWriter(outputstreamwriter1);
        //Mitteilen, welchen Kommprofil zum verbindugn genutzt werden soll.
        bufferedwriter.write("bezn");
        while (true) {
            if (bufferedreader.ready()) {
                bufferedwriter.write(bufferedreader.readLine() + 'n');
                bufferedwriter.flush();
            }
            if (bufferedreader1.ready()) {
                bufferedwriter1.write(bufferedreader1.readLine() + 'n');
                bufferedwriter1.flush();
            }

        }

"服务器":

 InputStream inputstream = sslsocket.getInputStream();
    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
        InputStream inputstream1 = System.in;
        InputStreamReader inputstreamreader1 = new InputStreamReader(inputstream1);
        BufferedReader bufferedreader1 = new BufferedReader(inputstreamreader1);
        OutputStream outputstream = System.out;
        OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
        BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
        OutputStream outputstream1 = sslsocket.getOutputStream();
        OutputStreamWriter outputstreamwriter1 = new OutputStreamWriter(outputstream1);
        BufferedWriter bufferedwriter1 = new BufferedWriter(outputstreamwriter1);

        while (true ) {
            if (bufferedreader.ready()) {
                bufferedwriter.write(bufferedreader.readLine() + 'n');
                bufferedwriter.flush();
            }
            if (bufferedreader1.ready()) {
                bufferedwriter1.write(bufferedreader1.readLine() + 'n');
                bufferedwriter1.flush();
            }
        }

由于您在循环中除了调用readLine()之外没有其他事情可做,所以只调用它。它会阻塞,直到有东西到达。在这种情况下,或者在任何情况下,您都不需要调用ready()。

我用这个变通方法"解决"了我的问题:

public class CopyStreamThread extends Thread {
    private BufferedWriter out;
    private BufferedReader in;
    public CopyStreamThread(BufferedWriter out, BufferedReader in) {
        this.out = out;
        this.in = in;
    }
    @Override
    public void run() {
        while (true) {
            try {
                out.write(in.readLine() + 'n');
                out.flush();
            } catch (IOException ex) {
                Logger.getLogger(CopyStreamThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    } 

"clinet/Server"

new CopyStreamThread(bufferedwriter, bufferedreader).start();
        new CopyStreamThread(bufferedwriter1, bufferedreader1).start();

我把等待输入分成两个线程,这不是一个很好的解决方案,但它很有效。

感谢您的支持。

最新更新