2013-04-04 24 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

相关问题