【问题标题】:JAVA TLS SOCKETS: bufferedreader.ready() always falseJAVA TLS SOCKETS:bufferedreader.ready() 总是假的
【发布时间】:2013-07-04 11:19:06
【问题描述】:

我想使用 TLS 编写一个小的“聊天”程序

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

我的问题是:“bufferedreader.ready()”总是返回false。 如果我删除 teh if -satetmant if 工作“正常”。程序一直等到有 \n 或 \r 并打印到 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("bez\n");

        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();

            }

        }

【问题讨论】:

  • 你检查ready方法结果的目的是什么?
  • 使用 PrintWriter 代替 BufferedWriter。 new PrintWriter("输出流", true);
  • 我想检查 ready 方法,所以我知道流中是否有我需要打印的信息。
  • PrintWriter 对这种情况没有帮助。

标签: java sockets ssl iostream readline


【解决方案1】:

因为您在循环中没有其他事情可做除了调用 readLine(),只需调用它即可。它会阻塞直到有东西到达。在这种情况下,甚至在任何情况下,您都不需要调用 ready()。

【讨论】:

  • 是的,但我想阅读 2 个不同的流。所以我不想阻止准备一个流
  • 好吧,ready()SSLSockets 不起作用,您对此别无选择。使用两个线程。
【解决方案2】:

我用这个解决方法“解决了”我的问题:

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);
            }
        }
    } 

“客户端/服务器”

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

我将等待输入分为 2 个线程,这不是一个很好的解决方案,但它可以工作。

感谢支持。

【讨论】:

  • 不正确。这段代码将永远运行,或者直到太阳变成新星。您必须检查readLine() 的结果是否为null,如果得到则停止循环并关闭输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2019-10-11
  • 2020-10-13
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多