2015-07-05 49 views
1

我無法真正看到錯誤在哪裏。試圖從JTextArea中回顯文本

我爲textAreaTop組件設置了一個KeyListener,因此每次按下某個鍵時都會向服務器發送一個字符串,並將其返回給teaxtAreaBottom組件。我知道stdIn尚未使用。

當按下第一個鍵,建立連接,而當第二鍵被按下我收到以下錯誤:無法獲取I/O到本地主機的連接。另外,textAreaBottom組件上沒有任何內容。

//客戶

@Override 
    public void keyPressed(KeyEvent e) { 
    String hostName = "localhost"; 
    int portNumber = 4000; 

    try (Socket echoSocket = new Socket(hostName, portNumber); 
     PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), 
        true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
        echoSocket.getInputStream())); 
     BufferedReader stdIn = new BufferedReader(
        new InputStreamReader(System.in))) { 

     String userInput = textAreaTop.getText(); 
     out.println(userInput); 
     textAreaBottom.setText(null); 
     textAreaBottom.setText(in.readLine()); 

    } catch (UnknownHostException ex) { 
     System.err.println("Don't know about host " + hostName); 
     System.exit(1); 
    } catch (IOException ex) { 
     System.err.println("Couldn't get I/O for the connection to " 
       + hostName); 
     System.exit(1); 
    } 
    } 

//服務器

public static void main(String[] args) throws IOException { 

    int portNumber = 4000; 

    try { 
     ServerSocket serverSocket = new ServerSocket(portNumber); 
     Socket clientSocket = serverSocket.accept(); 
     System.out.println("connection accepted"); 
     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), 
       true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
       clientSocket.getInputStream())); 
     { 
      String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       out.println(inputLine); 
      } 
     } 
    } catch (IOException e) { 
     System.out 
       .println("Exception caught when trying to listen on port " 
         + portNumber + " or listening for a connection"); 
     System.out.println(e.getMessage()); 
    } 
} 

任何建議,將不勝感激。

感謝

+0

您是否在每個keyPressed事件結束時關閉連接? 因爲每次你打開一個新的連接與插座在相同的主機名和端口號,你應該確保關閉連接。 – Marcin

+0

嗨Marcin。我想我不是......所有與套接字/網絡連接有關的事情都在上面的代碼塊中。儘管我現在有工作。 我已經設置了程序的方式,每一個按鍵時(我認爲)連接,所以我應該關閉I/O流和插座按下每個按鍵後? 我想我可以關閉所有三個「最後」塊。 – user3742439

+0

嘗試將'echoSocket.close()'放在try塊的末尾。這裏關於Java +插座+ EventDispatchThread(E.I. EDT) – Marcin

回答

1

的問題是,由於兩個小瑕疵:

  1. 您應該實現keyReleased()代替keyPressed(),因爲textAreaTop文本正在被keyPressed()被調用後更新。因此,當調用keyReleased()方法時,您的textAreaTop具有您輸入的最新文本。

  2. 你不應該創建你按下一個鍵時Socket對象每次。你應該定義爲輸入/輸出StreamskeyReleased(前者的keyPressed)之外匿名類和方法Socket和引用。因此,每次按一個鍵時,唯一的工作就是將textAreaTopout.println(text)中的文本發送到服務器。在這種情況下,我測試了代碼,並且它正常工作。

祝你好運。

+0

感謝STaefi開始與更多的併發性,我會嘗試。 – user3742439