2015-01-07 1 views
0

, так что я должен был сделать простую клиент-серверную программу. стороне сервера `В то время как цикл в клиент-серверной программе

public static void main(String[] args) throws IOException 
{ 
    ServerSocket ss = null; 
    try{ss= new ServerSocket(119);} 
    catch(IOException ioe){System.out.println("Can't connect to port.");} 

    Socket sock = null; 
    try{sock = ss.accept();} 
    catch(IOException ioe){System.out.println("Can't connect to client.");} 
    System.out.println("Connection successful."); 

    PrintStream out = null; 
    Scanner in = null; 

    try{ 
     out = new PrintStream(sock.getOutputStream()); 
     in = new Scanner(sock.getInputStream()); 
    }catch(Exception e) 
    { 
     System.out.println("Error."); 
    } 

    String line; 
    String lines = ""; 

    while((line = in.nextLine()) != null) 
    { 
     switch(line) 
     { 
     case "list":out.println("Printing something");break; 
     case "loop": 
     { 
      FileReader fr = new FileReader("D:\\Eclipse\\TestFiles\\text2.txt"); 
      BufferedReader br = new BufferedReader(fr); 
      while((lines = br.readLine()) != null) 
      { 
       out.println(lines); 
      } 
      break; 
     } 
     default: 
     { 
      if(!(line.equals("end"))) out.println("Unknown command.Try again.");break; 
     } 
     } 
     out.flush(); 
     if(line.equals("end")) 
     { 
      out.println("Connection over."); 
      break; 
     } 
    } 

    try{ 
     in.close(); 
     out.close(); 
     sock.close(); 
     ss.close(); 
    }catch(IOException ioe){} 

} 

`

стороне клиента

public static void main(String[] args) 
{ 
    Socket sock = null; 
    PrintStream out = null; 
    Scanner in = null; 
    Scanner sIn = null; 

    try{ 
     sock = new Socket("localhost",119); 
     out = new PrintStream(sock.getOutputStream()); 
     in = new Scanner(sock.getInputStream()); 
     sIn = new Scanner(System.in); 
    }catch(Exception e){ 
     System.out.println("Error connecting to server."); 
     System.exit(1); 
    } 

    System.out.println("Connection successful."); 

    String temp = ""; 

    while((temp = sIn.nextLine()) != null) 
    { 
     out.println(temp); 
     while(in.hasNextLine())System.out.println(in.nextLine()); 
     out.flush(); 
     if(temp.equals("end")) break; 
    } 

    try{ 
     sock.close(); 
     in.close(); 
     out.close(); 
    }catch(IOException ioe){} 

} 

Моя проблема заключается в том, что на стороне клиента, когда второй во время цикла (ВКЛ внутри первого во время цикла) должен end, это не так, и я просто вводю команды в клиенте без ответа

+0

вы можете хранить входные данные из входного потока и проверить сказать, если использовать r зашел, тогда в этом случае перерыв из внутреннего цикла while. – SMA

+0

Вы не должны делать этого во вложенном цикле while, здесь вы просто вводите пользовательский ввод бесконечным, даже не отправляя. – Sarz

+0

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

ответ

1

Исправления

  1. Использование PrintWriter для записи в гнездо и BufferedReader, чтобы читать из розетки. Открыть PrintWriter в auto flush mode true в приведенном ниже описании означает это. Таким образом, вам не нужно беспокоиться о том, чтобы смыть поток.

    PrintWriter out = new PrintWriter(sock.getOutputStream(),true); 
    
  2. Ваши заключительные утверждения в петле, которая закрывает потоки, и вы не можете использовать их для следующей итерации, потому что вы получите exception. Вытащите их из цикла while.
  3. Ненужные скобки для разграничения корпусов в коммутаторе.
  4. Ваши заявления о завершении соединения должны быть выведены из корпуса коммутатора. Только тогда разрыв будет влиять на цикл вместо этого на коммутаторе.
  5. Я использовал br.ready(), чтобы понять, готов ли поток к чтению, а затем итерации по петле. Это эффективнее, чем ваша версия.

    while((temp = sIn.nextLine()) != null) 
    { 
        out.println(temp); 
        Thread.currentThread().sleep(1000); 
        while(in.ready())System.out.println(in.readLine()); 
        out.flush(); 
        if(temp.equals("end")) break; 
    } 
    
  6. Thread.currentThread(). Сон (1000), чтобы получить дескриптор основного потока и спать на 1000 мс, таким образом, я позволяю бр быть готов с ответом сервера. иначе br.ready() будет false для данного запроса и будет готов к следующей итерации. Думаю, вы знаете, что я пытаюсь передать.

Я не проверял петлю корпуса;

Сервер

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

public class chatServer 
{ 
public static void main(String[] args) throws IOException 
{ 
    ServerSocket ss = null; 
    try 
    { 
     ss= new ServerSocket(8000); 
    } 
    catch(IOException ioe){System.out.println("Can't connect to port.");} 

    Socket sock = null; 
    try{sock = ss.accept();} 
    catch(IOException ioe){System.out.println("Can't connect to client.");} 
    System.out.println("Connection successful."); 

    PrintWriter out = null; 
    Scanner in = null; 

    try{ 
     out = new PrintWriter(sock.getOutputStream(),true); 
     in = new Scanner(sock.getInputStream()); 
    }catch(Exception e) 
    { 
     System.out.println("Error."); 
    } 

    String line; 
    String lines = ""; 

    while((line = in.nextLine()) != null) 
    { 
     switch(line) 
     { 
      case "list": 
       out.println("1. bla | 2. ble | 3. bli");break; 
      case "group":out.println("Here group will be chosen.");break; 
      case "header":out.println("Returns header.");break; 
      case "loop": 
       FileReader fr = new FileReader("D:\\Eclipse\\TestFiles\\text2.txt"); 
       BufferedReader br = new BufferedReader(fr); 
       while((lines = br.readLine()) != null) 
       { 
        out.println(lines); 
       } 
       break; 
      default: 
       if(!(line.equals("end"))) 
       { 
        out.println("Unknown command.Try again."); 
        break; 
       } 
     } 
     if(line.equals("end")) 
     { 
      out.println("Connection over."); 
      break; 
     } 
    } 
    try{ 
      in.close(); 
      out.close(); 
      sock.close(); 
      ss.close(); 
     }catch(IOException ioe){} 

} 

}

Client

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

public class chatClient 
{ 
public static void main(String[] args) throws IOException, InterruptedException 
{ 
    Socket sock = null; 
    PrintStream out = null; 
    BufferedReader in = null; 
    Scanner sIn = null; 

    try 
    { 
     sock = new Socket("localhost",8000); 
     out = new PrintStream(sock.getOutputStream()); 
     in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
     sIn = new Scanner(System.in); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Error connecting to server."); 
     System.exit(1); 
    } 

    System.out.println("Connection successful."); 

    String temp = ""; 

    while((temp = sIn.nextLine()) != null) 
    { 
     out.println(temp); 
     Thread.currentThread().sleep(1000); 
     while(in.ready())System.out.println(in.readLine()); 
     out.flush(); 
     if(temp.equals("end")) break; 
    } 

    try 
    { 
     sock.close(); 
     in.close(); 
     out.close(); 
    } 
    catch(IOException ioe){} 

} 

}

+0

Сделал это! Большое спасибо –

+0

WC! и принимать ответы, если они помогут вам решить вашу проблему – saikumarm