loaler
loaler

Reputation: 11

Code not working after if clause

I'm new to network programming and wrote a chat client. It's almost working, but when I add the if clause suddenly in.hasnext returns false even when my server actually sends something.

With if clause:

    @Override
public void run() {
    while(!server.isClosed()){


        if(ChatClient.WriteListener.message!=null){
            String m = ChatClient.WriteListener.message;
            out.println(m);
            ChatClient.WriteListener.message = null;
        }

        if(in.hasNext()){
            System.out.println("hab");
            String message = in.next();
            textPane.setText(textPane.getText()+"\n"+message.replaceAll("_", " "));
        }
        out.flush();
    }
    System.out.println("closed");

}

Without if clause

public void run() {
    while(!server.isClosed()){          
        out.println(ChatClient.WriteListener.message);      
        if(in.hasNext()){
            System.out.println("hab");
            String message = in.next();
            textPane.setText(textPane.getText()+"\n"+message.replaceAll("_", " "));
        }
    }
    System.out.println("closed");

}

Creation of in and out:

    public UserThread(Socket s){
    server = s;
    try {
        out = new PrintWriter( server.getOutputStream(), true );
        in  = new Scanner( server.getInputStream() );
    } catch (IOException e) {
        e.printStackTrace();
    }
}

WriteListener

public static class WriteListener implements ActionListener {
    JTextField text;
    static String message;
    public WriteListener(JTextField jtf){
        text = jtf;
    }
    public void actionPerformed(ActionEvent ev) {       
        message = text.getText();
    }
  }

Upvotes: 1

Views: 61

Answers (1)

Michal
Michal

Reputation: 786

Problem in your code is here:

if (ChatClient.WriteListener.message!=null){
        String m = ChatClient.WriteListener.message;
        out.println(m);
        ChatClient.WriteListener.message = null;
}

Your out is of instance PrintWriter(OutputStream out, boolean autoFlush). When you call out.println(m) in the first if statement PrintWriter flushes buffer/stream on the Socket resulting in your second if(in.hasNext()) statement returning false because your I/O from socket was auto closed by PrintWriter. You need to change/remove true from the initialization of the PrintWriter as follows :

try {
    out = new PrintWriter( server.getOutputStream());
    in  = new Scanner( server.getInputStream() );
} catch (IOException e) {
    e.printStackTrace();
}

JavaDoc: PrintWriter(OutputStream out, boolean autoFlush)

Upvotes: 1

Related Questions