2016-05-11 6 views
1

私はネットワークプログラミングを初めて利用し、チャットクライアントを作成しました。ほとんどの場合動作しますが、if節を追加すると、サーバが実際に何かを送信しても、in.hasnextはfalseを返します。if節の後にコードが動作しない

@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"); 

} 

内と外の創造

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

} 

句がなければ、:if節で

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(); 
    } 
    } 
+1

'ChatClient.WriteListener.message = NULL;'なぜあなたはこれをしましたか? – Zircon

+1

'in'とは何ですか?どのように作成されますか? –

+0

'in'と' out'の作成のためのコードを追加してください – Sanjeev

答えて

1
コード内

問題はここにある:

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

あなたoutがインスタンスPrintWriter(OutputStream out, boolean autoFlush)です。 ifステートメントifPrintWriterout.println(m)を呼び出すと、ソケットからのI/OがPrintWriterによって自動的に閉じられたため、if(in.hasNext())ステートメントが返され、結果としてfalseが返されます。

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

のJavaDoc:あなたは次のように PrintWriterの初期化から trueを削除/変更する必要が PrintWriter(OutputStream out, boolean autoFlush)

+0

まだ動作しませんでした – loaler

+0

引数を単に削除するのではなくfalseに変更しましたか? –

+0

私はそれを削除しました。しかし、とにかくそれはif節なしで働いた... – loaler

関連する問題