Reputation: 11
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
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