2016-08-30 18 views
1

まず、すべてのコードをお詫び申し上げますが、あまりにも多くのコードが十分でないように感じる。私はシンプルなチャットクライアントとプリントライターを作っています。特に苦労しています。コードを使用すると、今はサーバークラスとやりとりし、印刷したいものを完全に細かく印刷できます。しかし、私が 'writer.flush();'を削除すると、印刷を停止します。明らかに間違っている私の理解で、 'writer.println(outgoing.getText());'これはサーバーに送信しようとしているテキストを送信するのに十分なはずです。私はすべての情報を書き込むフラッシュ力を理解していますが、私は何を書いているのかまだ書いている時にこれがなぜ必要なのですか?Java - PrintWriterを理解し、フラッシュする必要がある

public class SimpleChatClientA { 

JTextArea incoming; 
JTextField outgoing; 
BufferedReader reader; 
PrintWriter writer; 
Socket sock; 

public void go(){ 

    JFrame frame = new JFrame("Ludicrously Simple Chat Client"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel mainPanel = new JPanel(); 

    incoming = new JTextArea(15,50); 
    incoming.setLineWrap(true); 
    incoming.setWrapStyleWord(true); 
    incoming.setEditable(false); 

    JScrollPane qScroller = new JScrollPane(incoming); 
    qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
    qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

    outgoing = new JTextField(20); 

    JButton sendButton = new JButton("Send"); 
    sendButton.addActionListener(new SendButtonListener()); 

    mainPanel.add(qScroller); 
    mainPanel.add(outgoing); 
    mainPanel.add(sendButton); 
    setUpNetworking(); 

    Thread readerThread = new Thread(new IncomingReader()); 
    readerThread.start(); 

    frame.getContentPane().add(BorderLayout.CENTER, mainPanel); 
    frame.setSize(400, 500); 
    frame.setVisible(true); 


}//close go 

public void setUpNetworking(){ 
    try{ 

     sock = new Socket("127.0.0.1", 5000); 

     InputStreamReader streamReader = new InputStreamReader(sock.getInputStream()); 

     reader = new BufferedReader(streamReader); 
     writer = new PrintWriter(sock.getOutputStream()); 
     System.out.println("network established"); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
}//close setupnetworking 

public class SendButtonListener implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     try{ 
      writer.println(outgoing.getText()); 
      writer.flush(); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
     outgoing.setText(""); 
     outgoing.requestFocus(); 
    } 

}//close sendbuttonlistener inner class 


public class IncomingReader implements Runnable{ 

    public void run(){ 
     String message; 
     try{ 

      while((message = reader.readLine()) != null){ 
       System.out.println("read " + message); 
       incoming.append(message + "\n"); 
      } 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

}//close inner class incomingreader 


public static void main(String[] args){ 
    new SimpleChatClientA().go(); 
} 

}

事前のおかげで、私は私が私が適切にStackOverflowに投稿した最初の時間を教えてください与えることができた情報はもう存在している場合。

答えて

1

PrintWriterクラスのクラスは、autoFlush属性が有効な場合にのみ、データをストリームに「コミット」します。 Javaのドキュメントからこの引用で

ルック:自動フラッシュが有効になっている場合

のprintln、printf関数、またはフォーマットのいずれかの方法が

リンクに呼び出されたときにのみ行われますJava docs:https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.OutputStream,%20boolean)

メッセージをサーバーに送信する必要がある場合は、autoflushオプションをオンにしてPrintWriterオブジェクトを作成します。だから、

、あなたはこの行い、writerオブジェクトを作成している:それを行う必要があります

writer = new PrintWriter(sock.getOutputStream(), true);

を。それが役に立てば幸い!

+0

Ahh okありがとう、私はドキュメントを読んだが、何らかの理由でそれはかなりクリックしていなかったが、あなたの説明を広げて、それは多くの助けになった。ありがとう! – fdbdcbc

1

printlnの後にデータをフラッシュしない方が効率的です。たくさんのデータを書いているのであれば、それをバッファして大量のチャンクで送信し、それぞれの行を別々に送信しないでください。データが本当に相手側に送信されるようにするには、ストリームを手動でフラッシュする必要があります。

あなたは友人に電子メールを書いているとし、各電子メールを自分の電子メールとして送信し、1つの電子メールで全文を送信するとします。あなたはどちらが速いと思いますか?確かに、もしあなたがそれを考えたときにあなたの言葉を送るならば、あなたの友人はメールをすばやく読むことになりますが、合計時間は長くなります。

+0

ありがとうございます。しかし、実際にprintlnが何をしているのかによって、printlnの後にデータを送信するためにflushを使用する必要があるのでしょうか?私はprintlnがストリームの向こう側にデータを送ったと思いましたか? Javaのドキュメントは、それが行を印刷すると言いますが、正確にどこに印刷していますか? – fdbdcbc

+0

バッファに入れる。バッファがいっぱいになると、バッファがフラッシュされます。それがいっぱいでない場合、それはまだフラッシュされません。 – Kayaman

+0

ああ、私はPrintWriterがバッファを持っていることを決して気付かなかった。 – fdbdcbc

関連する問題