如何在java中检查objectinputstream是否为空?

mf98qq94  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(606)

我试图通过套接字实现一个基本的聊天应用程序,但我有objectinputstream的问题。我在while(true)循环中同时使用write-read方法,而编译过程在没有可读取内容并无限期等待时陷入困境。因此,我需要检查它是空的还是不读之前。
这是我的密码。
服务器:

Socket socket = server.accept();

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

        oos.writeObject("Server connected!");
        oos.flush();

        String message = (String) ois.readObject();
        System.out.println(ois.available());
        txtChat.setText(message);

        while(true) {

            if(sendMessage) {

                oos.writeObject(txtMessage.getText());
                oos.flush();

                sendMessage = false;
            }

            while(!sendMessage) {
                message = (String) ois.readObject();
                txtChat.setText(txtChat.getText()+"\n"+"Client: "+message);
            }

            Thread.sleep(100);
        }

客户:

socket = new Socket(host.getHostName(), 9876);
        oos = new ObjectOutputStream(socket.getOutputStream());
        ois = new ObjectInputStream(socket.getInputStream());

        oos.flush();

        String message = (String) ois.readObject();
        txtChat.setText(message);

        while(true) {
            message = (String) ois.readObject();
            txtChat.setText(txtChat.getText()+"\n"+"Server: "+message);

            if(sendMessage) {
                oos.writeObject(txtMessage.getText());
                oos.flush();

                sendMessage = false;
            }

            Thread.sleep(100);
        }
xmakbtuz

xmakbtuz1#

流不是关闭就是打开。
在您从输入流中读取某些内容之前,它不会意识到它已关闭。这正是为什么不存在这样的问题 isClosed() 流上的方法。
您可以将流中的字节读入对象。充其量只能构造对象。否则,您应该处理io异常并做出相应的决定。
或者,您可以检查在不阻塞的情况下可以读取多少字节。如果它是0,那么您看到的是一个等待输入的空流。

inputStream.available() != 0 //handle exception

相关问题