2012-12-02 55 views
0

我正在開發一個簡單的Java GUI聊天程序。目標是讓用戶選擇是否託管服務器或作爲客戶端進行連接。所有這些工作。我遇到的問題是讓客戶端或服務器聊天。理想情況下,用戶或服務器可以輸入textField並按回車(或按發送按鈕),然後該消息將被髮送到每個連接的客戶端。在執行過程中,服務器運行一個無限循環,等待更多的客戶端。我遇到的問題有兩方面: 1)我不確定是否將字符串傳遞給輸入流的方式是正確的,以及2)我不知道何時可以讓服務器接收和然後重新發送數據,因爲它在server.accept()處等待。試圖從文本字段獲取數據輸出到Java聊天程序

這裏的run方法:

public void run() 
{ 
    conversationBox.appendText("Session Start.\n"); 
    inputBox.requestFocus(); 

    while (!kill) 
    { 
     if (isServer) 
     { 
      conversationBox.appendText("Server starting on port " + port + "\n"); 
      conversationBox.appendText("Waiting for clients...\n"); 
      startServer(); 
     } 
     if (isClient) 
     { 
      conversationBox.appendText("Starting connection to host " + host + " on port " + port + "\n"); 
      startClient(); 
     } 
    }  

} 

這裏的startClient方法:

public void startClient() 
{ 
    try 
    { 
     Socket c = new Socket(host, port); 
     in = new Scanner(c.getInputStream()); 
     out = new PrintWriter(c.getOutputStream()); 
     while (true) 
     { 
      if (in.hasNext()) 
      { 
       Chat.conversationBox.appendText("You Said: " + message); 
       out.println("Client Said: " + message); 
       out.flush(); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

和這裏的StartServer方法:

public void startServer() 
    { 
     try 
     { 
      server = new ServerSocket(port); 
      while (true) 
      { 
       s = server.accept(); 
       conversationBox.appendText("Client connected from " + s.getLocalAddress().getHostName() + "\n");  
      } 
     } 
     catch (Exception e) 
     { 
      conversationBox.appendText("An error occurred.\n"); 
      e.printStackTrace(); 
      isServer = false; 
      reEnableAll(); 
     } 

    } 

最後,這裏的actionPerformed其中的一部分我得到數據並(嘗試)將它寫入輸出流:

if (o == sendButton || o == inputBox) 
    { 
     if(inputBox.getText() != "") 
     { 
      out.println(inputBox.getText()); 
      inputBox.setText(""); 
     } 
    } 

我想我的問題是:我如何重新排列我的方法,以便服務器可以等待客戶端的文本,然後將其發送回所有客戶端?而且,如何將客戶端的文本發送到服務器?

+0

哦,哇,是的,我想這不是一個真正的問題。編輯。 –

回答

0

在這段代碼的問題:

  1. 你不斷創造客戶端和服務器。當然你應該只做一個?

  2. 您正在對事件線程而不是單獨的線程執行阻止網絡操作。

  3. 您正在EOS上循環while(true)... if in.hasNext()。這應該是while(in.hasNext())...

  4. 你正在接受一個套接字,並沒有明顯的做任何事情。看起來你一次只能處理一個客戶。您應該啓動一個新線程來處理每個接受的套接字。

相關問題