2017-03-19 17 views
1

このコードの断片では、クライアントはサーバーにStringを送信します。 サーバーはそれを元に戻し、クライアントに再送信します。 BUT、クライアントは文字列を受信しませんでした。 または、サーバーが逆の文字列を受け取っていない可能性があります。java内のTCPソケット

Serverコード:

public class Serveur { 
public static void main(String[] args) { 
    ServerSocket sock = null; 
    Socket link = null; 
    BufferedReader input = null; 
    PrintWriter output = null; 

    try { 
     sock = new ServerSocket(1234); 
     link = sock.accept(); 
     input = new BufferedReader(new InputStreamReader(link.getInputStream())); 
     output = new PrintWriter(link.getOutputStream()); 
     String str, rstr; 
     while(true){ 
      System.out.println("entered while loop"); 
      str = input.readLine(); 
      System.out.println("we received : " + str); 
      rstr=""; 
      for (int i = 0; i < str.length(); i++) 
       rstr = str.charAt(i) + rstr; 
      System.out.println("we will send to the client : " + rstr); 
      output.print(rstr); 
      System.out.println("sent"); 
     } 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 
} 
} 

クライアントコード:

public class Client { 

    public static void main(String[] args) { 
     Socket sock = null; 
     PrintWriter output = null; 
     BufferedReader input = null; 

     try { 
      sock = new Socket(InetAddress.getLocalHost(), 1234); 
      output = new PrintWriter(sock.getOutputStream()); 
      input = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      String str; 
      Scanner s = new Scanner(System.in); 
      while(true){ 
       System.out.println("Ecrire une chaine de caractere : "); 
       str = s.nextLine(); 
       System.out.println("i want to reverse : " + str);  
       output.println(str); 
         System.out.println("ch is sent"); 
         String rr = input.readLine(); 
       System.out.print(rr); 
         System.out.println("reversed word is received"); 
      } 
     } catch (UnknownHostException ex) { 
      System.out.println(ex.getMessage()); 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
} 

} 

サーバー出力:

entered while loop 

クライアントの出力:

Ecrire une chaine de caractere : 
teste 
i want to reverse : teste 
ch is sent 
+0

それとも、私達にあなたのクライアントとサーバの出力を与えていませんか? – Adonis

+0

サーバ上で診断を使用することで、少なくとも*どのような場合でも対処できるはずです。 –

+0

それぞれにブレークポイントを設定し、コードをステップ実行するとどうなりますか? – efekctive

答えて

0

あなたが直面している唯一の問題は、出力ストリームをフラッシュすることに関連しています。そのため、メソッドの受け入れが成功したにもかかわらず、クライアントからの入力を読み取るステップでは、サーバー側は保留状態のままです。

flushは、flush()を呼び出す前にライターに書き込まれたものが、内部のバッファに収めるのではなく、元のストリームに書き込まれるようにします。別のプロセス(またはスレッド)はそれが書き込まれている間、ファイルを調査する必要がある場合

  • 、それは他のプロセスがすべて見ていることが重要です:

    方法は、状況のいくつかのタイプに便利です最近の書き込み。

  • 書き込みプロセスがクラッシュする可能性があり、ファイルへの書き込みが失われないようにすることが重要です。

  • コンソールへの書き込み、およびすべてのメッセージは、すぐにそれが

を書かれているように示されていることを確認する必要がありますしている場合(参照: How to use flush for PrintWriterを)私はそれに応じてコードを更新

それが働いています。

更新サーバコード:

public class Serveur { 
    public static void main(String[] args) { 
     ServerSocket sock = null; 
     Socket link = null; 
     BufferedReader input = null; 
     PrintWriter output = null; 

     try { 
      sock = new ServerSocket(9890); 
      link = sock.accept(); 
      input = new BufferedReader(new InputStreamReader(link.getInputStream())); 
      output = new PrintWriter(link.getOutputStream()); 
      String str, rstr; 
      while(true){ 
       System.out.println("entered while loop"); 
       str = input.readLine(); 
       System.out.println("we received : " + str); 
       rstr=""; 
       for (int i = 0; i < str.length(); i++) 
        rstr = str.charAt(i) + rstr; 
       System.out.println("we will send to the client : " + rstr); 
       output.println(rstr); 

       output.flush(); 
       System.out.println("sent"); 
      } 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

} 

更新されたクライアントコード:

public class Client { 
    public static void main(String[] args) { 
     Socket sock = null; 
     PrintWriter output = null; 
     BufferedReader input = null; 

     try { 
      sock = new Socket(InetAddress.getLocalHost(), 9890); 
      output = new PrintWriter(sock.getOutputStream()); 
      input = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      String str; 
      Scanner s = new Scanner(System.in); 
      while(true){ 
       System.out.println("Ecrire une chaine de caractere : "); 
       str = s.nextLine(); 
       System.out.println("i want to reverse : " + str);  
       output.println(str); 
       output.flush(); 
         System.out.println("ch is sent"); 
         String rr = input.readLine(); 
       System.out.print(rr); 
         System.out.println("reversed word is received"); 
      } 
     } catch (UnknownHostException ex) { 
      System.out.println(ex.getMessage()); 
     } catch (IOException ex) { 
      //Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
} 

} 

、世界の文こんにちはプログラマとイラスト。

enter image description here