为什么我不能两次使用我的 DataOutputStream?

问题描述

我尝试向我的服务器发送消息两次,但一直出现错误。我想知道我应该怎么做才能使这件事发挥作用。我一直在这一行出现错误“msgToServer.witeBytes("GETACCESS"+jTextFieldUsername.getText()+""+jTextFieldPassword.getText()+"\n")”。

客户:

try {
        s = new Socket("localhost",6000);

        Socket incoming;
        incoming = s;
     
        msgFromServer = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
        msgToServer = new DataOutputStream(incoming.getoutputStream());

        msgToServer.writeBytes("LOGIN "+jTextFieldUsername.getText()+" "+jTextFieldPassword.getText()+"\n");
        
        String result;
        result = msgFromServer.readLine();

        if(result.equals("TRUE")){
            JOptionPane.showMessageDialog(null,"Client Access is granted");
        }
        else if(result.equals("False")){
            JOptionPane.showConfirmDialog(this,"Client Access is not granted");
        }
        msgToServer.writeBytes("GETACCESS"+ jTextFieldUsername.getText() + " "+ jTextFieldPassword.getText() + "\n");
        String h1;
        h1 = msgFromServer.readLine();
        JOptionPane.showConfirmDialog(this,"hl: "+h1);
        if(h1.equals("Teacher")){
            
            refreshTable(2);
            JOptionPane.showConfirmDialog(this,"You were granted as a lecturer");
        }
        else if(h1.equals("Student")){
            refreshTable(1);
            JOptionPane.showConfirmDialog(this,"You were granted as a student");
        }

    } catch (IOException ex) {
        Logger.getLogger(presensiClientFrame.class.getName()).log(Level.SEVERE,null,ex);
    }

我的错误

java.net.socketException: Connection reset
at java.net.socketInputStream.read(SocketInputStream.java:210)
at java.net.socketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)

//....

解决方法

server 阻塞,直到有客户端连接到它,然后再次阻塞以侦听来自客户端的消息,在单个消息之后,它关闭连接,因为代码不处理连续性。为了保持持续的通信活跃,你需要像这样执行读、写

            String inputLine;
            while ((inputLine = msgFromServer.readLine()) != null) {
                if (".".equals(inputLine)) {
                    out.println("bye");
                    break;
                }
                msgToServer.writeBytes("GETACCESS"+ jTextFieldUsername.getText() + " "+ jTextFieldPassword.getText() + "\n");
            }