2013-04-04 2 views
0

Я слежу за Java Trail в сети. Три класса KnockKnock, используемые в качестве примеров (клиент, сервер и протокол), работают по назначению, когда я копирую/вставляю их в Eclipse. Однако то, что я действительно хочу сделать, это исключить класс протокола и просто вернуть сервер обратно клиенту, который я ввешу в консоль. Я пробовал модифицировать серверную программу главным образом, комментируя ссылки на класс протокола, но почему-то я закончил работу над программой.Почему эта базовая клиент-серверная программа не передает данные?

Я так новичок, что я не знаю, что случилось, и чем больше я ищу ответ в электронных книгах и на веб-сайтах, тем больше я смущаюсь. Все, что я обнаружил, это то, что я почти ничего не знаю о том, как работают потоки ввода-вывода. Я вставил все три класса ниже в порядке: сервер, клиент, протокол. Где проблема и почему это проблема:

Сервер:

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

ответ

1

Я думаю, ваша проблема только оба приложения ждут: , когда KKServer запускается, он ждет клиента, а затем он ждет, пока cl ient «говорит» что-то, и клиент ждет, пока сервер ничего не скажет, прежде чем ждать ввода пользователя

+0

Привет, Пабло, спасибо. Так оно и было. Я был смущен тем, что выражение "while ((fromServer = in.readLine()) = null)" на самом деле. Я думал, что сервер будет ждать и отвечать на вход пользователя через консоль, даже если на клиент не будет отправлен контент с сервера. Мне пришлось начать процесс чата, выполнив out.println. Я напечатал out.println («Чат начал»); который вызвал текстовый ответ от сервера, который дал чтение in.readLine(), которое дало мне доступ к циклу while. Тогда программа работала нормально. –

 Смежные вопросы

  • Нет связанных вопросов^_^