2013-04-04 25 views
0

我正在關注網絡上的Java Trail。當我將它們複製/粘貼到Eclipse中時,用作示例的三個KnockKnock類(客戶機,服務器和協議)按預期工作。然而,我真正想要做的是消除協議類,只要讓服務器迴應客戶端,無論我輸入到控制檯。我嘗試修改服務器程序,主要是通過評論對協議類的引用,但不知何故,我最終打破了該程序。這個基本的客戶服務器程序爲什麼不傳遞數據?

我是如此的新,以至於我對於什麼是錯的一無所知,我在電子書和網站上搜索的答案越多,我就越困惑。我所發現的是,我幾乎不知道IO流如何真正起作用。我按順序粘貼了下面三個類:服務器,客戶端,協議。問題出在哪裏,以及爲什麼它是一個問題:

服務器:

import java.net.*; 
import java.io.*; 

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

     ServerSocket serverSocket = null; 
     try { 
      serverSocket = new ServerSocket(4444); 
     } catch (IOException e) { 
      System.err.println("Could not listen on port: 4444."); 
      System.exit(1); 
     } 

     Socket clientSocket = null; 
     try { 
      clientSocket = serverSocket.accept(); 
      System.out.println("Client Accepted"); 
     } catch (IOException e) { 
      System.err.println("Accept failed."); 
      System.exit(1); 
     } 

     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(
       new InputStreamReader(
       clientSocket.getInputStream())); 
     String inputLine, outputLine; 
     //KnockKnockProtocol kkp = new KnockKnockProtocol(); 

     //outputLine = kkp.processInput(null); 
     //out.println(outputLine); 

     while ((inputLine = in.readLine()) != null) { 
      //outputLine = kkp.processInput(inputLine); 
      //out.println(outputLine); 
      out.println(inputLine); 
      if (inputLine.equals("Bye.")) 
       break; 
     } 
     out.close(); 
     in.close(); 
     clientSocket.close(); 
     serverSocket.close(); 
    } 
} 

客戶:

import java.io.*; 
import java.net.*; 

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

     Socket kkSocket = null; 
     PrintWriter out = null; 
     BufferedReader in = null; 

     try { 
      kkSocket = new Socket("localhost", 4444); 
      out = new PrintWriter(kkSocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream())); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host: taranis."); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for the connection to: taranis."); 
      System.exit(1); 
     } 

     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
     String fromServer; 
     String fromUser; 

     while ((fromServer = in.readLine()) != null) { 
      System.out.println("Server: " + fromServer); 
      if (fromServer.equals("Bye.")) 
       break; 

      fromUser = stdIn.readLine(); 
     if (fromUser != null) { 
       System.out.println("Client: " + fromUser); 
       out.println(fromUser); 
     } 
     } 

     out.close(); 
     in.close(); 
     stdIn.close(); 
     kkSocket.close(); 
    } 
} 

協議:

import java.net.*; 
import java.io.*; 

public class KnockKnockProtocol { 
    private static final int WAITING = 0; 
    private static final int SENTKNOCKKNOCK = 1; 
    private static final int SENTCLUE = 2; 
    private static final int ANOTHER = 3; 

    private static final int NUMJOKES = 5; 

    private int state = WAITING; 
    private int currentJoke = 0; 

    private String[] clues = { "Turnip", "Little Old Lady", "Atch", "Who", "Who" }; 
    private String[] answers = { "Turnip the heat, it's cold in here!", 
           "I didn't know you could yodel!", 
           "Bless you!", 
           "Is there an owl in here?", 
           "Is there an echo in here?" }; 

    public String processInput(String theInput) { 
     String theOutput = null; 

     if (state == WAITING) { 
      theOutput = "Knock! Knock!"; 
      state = SENTKNOCKKNOCK; 
     } else if (state == SENTKNOCKKNOCK) { 
      if (theInput.equalsIgnoreCase("Who's there?")) { 
       theOutput = clues[currentJoke]; 
       state = SENTCLUE; 
      } else { 
       theOutput = "You're supposed to say \"Who's there?\"! " + 
       "Try again. Knock! Knock!"; 
      } 
     } else if (state == SENTCLUE) { 
      if (theInput.equalsIgnoreCase(clues[currentJoke] + " who?")) { 
       theOutput = answers[currentJoke] + " Want another? (y/n)"; 
       state = ANOTHER; 
      } else { 
       theOutput = "You're supposed to say \"" + 
       clues[currentJoke] + 
       " who?\"" + 
       "! Try again. Knock! Knock!"; 
       state = SENTKNOCKKNOCK; 
      } 
     } else if (state == ANOTHER) { 
      if (theInput.equalsIgnoreCase("y")) { 
       theOutput = "Knock! Knock!"; 
       if (currentJoke == (NUMJOKES - 1)) 
        currentJoke = 0; 
       else 
        currentJoke++; 
       state = SENTKNOCKKNOCK; 
      } else { 
       theOutput = "Bye."; 
       state = WAITING; 
      } 
     } 
     return theOutput; 
    } 
} 
+0

看這裏:http://stackoverflow.com/questions/15653074/a-simple-java-client-server- program?rq = 1 – KevinDTimm 2013-04-04 16:16:14

回答

1

我認爲你的問題僅僅是這兩個應用正在等待: 當KKServer啓動時,它等待客戶端,然後等待直到cl客戶「說」的東西,客戶端等待,直到服務器在等待用戶輸入之前說的東西

+0

你好巴勃羅,謝謝。就是這樣。我對「while((fromServer = in.readLine())!= null)」語句「實際上做了什麼」感到困惑。我認爲服務器會等待並響應用戶通過控制檯的輸入,即使服務器沒有內容曾經被髮送到客戶端。我必須通過執行out.println來啓動聊天過程。我輸入了out.println(「開始聊天」);它觸發了來自服務器的文本響應,它給了in.readLine()一些東西來讀取,這讓我可以訪問while循環。然後程序運行良好。 – 2013-04-04 22:35:01

相關問題