2012-08-13 79 views
1

這是我使用(它不是我)的代碼Java的簡單的聊天客戶端查詢

import java.io.*; 
import java.net.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 


public class SimpleChatClient { 
JTextArea incoming; 
JTextField outgoing; 
BufferedReader reader; 
PrintWriter writer; 
Socket sock; 

public void go() { 
    JFrame frame = new JFrame("Ludicrously Simple Chat Client"); 
    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_ALWAYS); 
    outgoing = new JTextField(20); 
    JButton sendButton = new JButton("Send"); 
    sendButton.addActionListener(new SendButtonListener()); 
    mainPanel.add(qScroller); 
    mainPanel.add(outgoing); 
    mainPanel.add(sendButton); 
    frame.getContentPane().add(BorderLayout.CENTER, mainPanel); 
    setUpNetworking(); 

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

    frame.setSize(650, 500); 
    frame.setVisible(true); 

} 

private 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("networking established"); 
    } 
    catch(IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

public class SendButtonListener implements ActionListener { 
    public void actionPerformed(ActionEvent ev) { 
     try { 
      writer.println(outgoing.getText()); 
      writer.flush(); 

     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     outgoing.setText(""); 
     outgoing.requestFocus(); 
    } 
} 

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

class IncomingReader implements Runnable { 
    public void run() { 
     String message; 
     try { 
      while ((message = reader.readLine()) != null) { 
       System.out.println("client read " + message); 
       incoming.append(message + "\n"); 
      } 
     } catch (IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

}

我的問題是在進入閱讀器類 爲什麼這條線--- - while ((message = reader.readLine()) != null) 永不返回空? 據說,線程去檢查這一行,另一方面沒有客戶端的消息,那麼上面的行不應該返回null?

任何人都可以解釋一下發生了什麼?我知道套接字連接和所有 我只想知道接收消息時發生了什麼。

回答

1

您正在使用阻塞函數,如BufferedReader.readLine()。這將阻止,直到有東西要讀。它不會「檢查設備,如果沒有返回,則返回null」。

如果結果大於0,可以使用BufferedReader.available()檢查是否有任何傳入數據,並調用readLine()。