Nie działający słownik - brak odpowiedzi z serwera

0

Cześć.
Chciałem spróbować sił z aplikacjami sieciowymi i znalazłem pewien tutorial. Jednakże o ile z pierwszą aplikacją nie miałem problemu to z tą nie mogę sobie poradzić. Podsyłam gotowy kod klienta i serwera(taki mały śmieszny słownik), który według autora tutoriala powinien działać, jednak tak nie jest, chyba coś się dzieje ze strumieniem wyjściowym, bo zmieniałem w kliencie strumień na DataInputStream i za pomocą metody avaible() zwróciło mi wartość 0.
Prosiłbym o pomoc co zrobić żeby program zwrócił mi słowo przetłumaczone i wytłumaczył dlaczego tak a nie inaczej.

Pozdrawiam
Paweł.

 
//program Serwera:
import java.net.*;
import java.io.*;

public class Serwer  {
public static void main(String args[]) {
    
        ServerSocket polaczenie = null;
        Socket gniazdo = null;
        InputStream we = null;
        OutputStream wy = null;
        BufferedReader odczyt = null;
        BufferedReader odczytWe = null;
        DataOutputStream zapis = null;
                String slowoPL="",slowoEN="";

try {
    polaczenie=new ServerSocket(8866);
    }
    catch(IOException e)
    { System.out.println("Nie można utworzyć gniazda serwera.");   }

try {
    gniazdo=polaczenie.accept();
    }
    catch(IOException e)
    {   System.out.println("Nie można nawiązać połączenia z klientem.");   }
                          
try {
    we=gniazdo.getInputStream();
    }
    catch(IOException e)
    {   System.out.println("Nie można pobrać strumienia wejściowego.");   }

try {
    wy=gniazdo.getOutputStream();
    }
    catch(IOException e)
    {   System.out.println("Nie można pobrać strumienia wyjściowego.");   }

while(true){
try{
    odczyt = new BufferedReader(new InputStreamReader(we));
    slowoPL = odczyt.readLine();
                    
     if((slowoPL == null) || slowoPL.equals("koniec"))
     {
     gniazdo.close();
     System.exit(0);
     }
                    
     else if( slowoPL!=null )
          {
          System.out.println("Odczytano slowo : " + slowoPL);
          if(slowoPL.equals("okno")){ slowoEN="window"; }
          else if(slowoPL.equals("ekran")){ slowoEN="screen"; }
          else if(slowoPL.equals("oko")){ slowoEN="eye"; }
          else if(slowoPL.equals("ucho")){ slowoEN="ear"; }
          else if(slowoPL.equals("dom")){ slowoEN="house"; }
          else if(slowoPL.equals("noga")){ slowoEN="leg"; }
          else if(slowoPL.equals("cukier")){ slowoEN="sugar"; }
          else { slowoEN="";
          }
                                    
zapis = new DataOutputStream(wy);
zapis.writeBytes(slowoEN+ " ");
zapis.flush();
System.out.println("Wyslano slowo : " + slowoEN);
                                 
          }
                                
   } catch(IOException e){  System.out.println("Problem wejścia - wyjścia.");   }
/* koniec pętli while: */
        }
}
}

//program Klienta:
import java.net.*;
import java.io.*;

public class Klient {
public static void main(String args[]) {
    
        Socket gniazdo = null;
                InputStream we=null;
                OutputStream wy=null;
        BufferedReader odczyt = null;
        BufferedReader odczytWe = null;
        DataOutputStream zapis = null;
        String slowoPL="",slowoEN="";
        
try {
    gniazdo=new Socket("localhost",8866);
    }
    catch(UnknownHostException e)
    {   System.out.println("Nieznana nazwa hosta.");   }
    catch(IOException e)
    {   System.out.println("Nie można utworzyć gniazda klienta.");   }

try {
    we=gniazdo.getInputStream();
    } catch(IOException e)
    {   System.out.println("Nie można pobrać strumienia wejściowego.");   }

try {
    wy=gniazdo.getOutputStream();
    } catch(IOException e)
    {   System.out.println("Nie można pobrać strumienia wyjściowego.");   }

System.out.println("Wpisz polskie slowo, a serwer je przetlumaczy.");
             
while(true){
        
try{
    odczytWe = new BufferedReader(new InputStreamReader(System.in));
    slowoPL = odczytWe.readLine();
            
   if (slowoPL.equals("koniec"))
                                {
                                gniazdo.close();
                                System.exit(0);
                                }
                
    else if( slowoPL!=null ) {
                              zapis = new DataOutputStream(wy);
                              zapis.writeBytes(slowoPL + " ");
                              zapis.flush();
                              System.out.print("Po polsku " + slowoPL);
            
                              odczyt = new BufferedReader (new InputStreamReader (we));
                              slowoEN=odczyt.readLine();
                
                              if ( slowoEN!=null )
                                                 {
                                                 System.out.println(" to po angielsku " + slowoEN);
                                                 }
                                
                              }
                              
    }  catch(IOException e){ System.out.println("Problem wejścia - wyjścia."); }
/* koniec pętli while: */
}
}
}
0

Debuger w dłoń i powodzenia. Nikt tego za ciebie nie zrobi.

0

Z pomocą debugera dowiedziałem się że program staje na linijce

 slowoPL = odczyt.readLine(); 

Jeżeli zamknę zapis za pomocą metody close() w kliencie to serwer przejdzie przez wymienioną wyżej linijkę kodu. No ale nie o to chodzi, nie chcę zamykać tego strumienia. Jak można to rozwiązać inaczej?

2

Jeśli chcesz odczytywać linie (readLine()), to wysyłaj linie:

zapis.writeBytes(slowoEN+ "\n"); //w serwerze
zapis.writeBytes(slowoPL + "\n"); //w kliencie

1 użytkowników online, w tym zalogowanych: 0, gości: 1