2016-09-02 7 views
-1

私はサーバークラスとクライアントクラスを持っています。サーバーとクライアントは互いにメッセージを交換します。このコードはテスト目的で作られたものであり、動作するはずの方法は次のとおりです。パーティー(クライアント/サーバー)がメッセージを送信すると、これまで相手が送信したすべてのメッセージを受け取ります(InputStream空です)。これを実装するコードの一部は、クライアントの間の内側に位置しており、サーバーのforループさ:ソケット出力が受信されていません

クライアント:

public class ClientSocketRunner { 
    private static String ip="localhost"; 
    private static int port=440; 
    private static String client="Client"; 
    private static String server="Server"; 

    public static void main(String[] args) throws Exception 
    { 
     ClientSocketRunner socket_runner=new ClientSocketRunner(); 
     socket_runner.run(); 
    } 

    private void run() throws Exception 
    { 
     Socket client_socket=new Socket(ip, port); 
     OutputStream os=client_socket.getOutputStream(); 
     InputStream is=client_socket.getInputStream(); 

     PrintStream make_output=new PrintStream(os); 
     BufferedReader read_input=new BufferedReader(new      
     InputStreamReader(is)); 

     make_output.println("Hello, I'm the Client"); 
     System.out.println(read_input.readLine()); 
     System.out.println("my port: "+client_socket.getLocalPort()); 

     String line=null; 
     BufferedReader user_input=new BufferedReader(new 
      InputStreamReader(System.in)); 
     while (!(line=user_input.readLine()).equals("-1")) 
     { 
       make_output.println(client+": "+line); 
       make_output.flush(); 
       System.out.println("sent"); 
       while (is.available()>0) 
     { 
      System.out.println(read_input.readLine()); 
     } 
       System.out.println("bytes: "+is.available()); 
     } 

     while (is.available()>0) 
     { 
      System.out.println(read_input.readLine()); 
     } 

    } 

サーバー:

public class ServerSocketRunner { 
    private static int port=440; 
    private static String client="Client"; 
    private static String server="Server"; 




    public static void main(String[] args) throws Exception 
    { 
     ServerSocketRunner ssRunner=new ServerSocketRunner(); 
     ssRunner.run(); 
    } 

    public void run() throws Exception 
    { 

     ServerSocket server_socket=new ServerSocket(port); 
     Socket socket=server_socket.accept(); 
     InputStream sin=socket.getInputStream(); 
     OutputStream sout=socket.getOutputStream(); 
     BufferedReader read_input=new BufferedReader(new InputStreamReader(sin)); 
     PrintStream make_output=new PrintStream(sout); 



     System.out.println(read_input.readLine()); 
     make_output.println("Good to meet you, I'm the Server"); 
     System.out.println("my port: "+socket.getLocalPort()); 

     String line; 
     BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in)); 



     for (line=user_input.readLine(); !(line.equals("-1")); line=user_input.readLine()) 
      { 
       make_output.println(server+": "+line); 
       make_output.flush(); 
       System.out.println("sent"); 
       while (sin.available()>0) 
       { 
        System.out.println(read_input.readLine()); 
       } 
      } 

     } 

    } 

しかし、期待どおりに動作しません。 。複数行の入力を行うと、各行に印刷(「送信」)されますが、相手に行くと、いくつかの行を送信して、予想される入力が表示されません。当事者間の次のカップルの交際まで。 何が問題なのですか?

+2

あなたは正しく終了の流れをチェックされていませんがあなたはNPEを手に入れます。あなたは古典的な 'available()'の誤用をしています。完全な行が利用できない場合に 'readLine()'でブロックされるので、無意味です。 – EJP

+0

@EJPだから、問題は、私はあまりにも短い行をタイプするので、彼らは反対側で読むことができないということですか?しかし、なぜこの問題は私が単に次のようにユーザの入力を読み込んで表示すると発生しないのですか? .equals( " - 1"))、 'System.out.println(" User: "+ line);'?最短の行であっても正しく正確に表示されます。 – parsecer

+0

いいえ、私は問題が何であるかは言及していません。私はあなたが 'available()'を無意味に呼んでいるとコメントしました*。それを除く。 – EJP

答えて

0

は、実際にこのコードは

を期待通りに動作しますが、あなたがしたい場合、例えば、サーバはすぐにこの
コード、クライアントの入力の使用が表示されますので、

public class ServerSocketRunner { 
    private static int port=440; 
    private static String client="Client"; 
    private static String server="Server"; 

public static void main(String[] args) throws Exception 
{ 
    ServerSocketRunner ssRunner=new ServerSocketRunner(); 
    ssRunner.run(); 
} 

public void run() throws Exception 
{ 

    ServerSocket server_socket=new ServerSocket(port); 
    Socket socket=server_socket.accept(); 
    InputStream sin=socket.getInputStream(); 
    OutputStream sout=socket.getOutputStream(); 
    BufferedReader read_input=new BufferedReader(new InputStreamReader(sin)); 
    PrintStream make_output=new PrintStream(sout); 

    System.out.println(read_input.readLine()); 
    make_output.println("Good to meet you, I'm the Server"); 
    System.out.println("my port: "+socket.getLocalPort()); 

    String line; 
    BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in)); 

    // here starts updated code 

    while(true) 
    { 
     if (user_input.ready()) 
     { 
      line=user_input.readLine(); 

      if(line.equals("-1")) { 
      break; 
      } 
      make_output.println(server+": "+line); 
      make_output.flush(); 
      System.out.println("sent"); 
     } 

     while (sin.available()>0) 
     { 
      System.out.println(read_input.readLine()); 
     } 
     Thread.sleep(500); 
    } 
    } 
} 


public class ClientSocketRunner { 
    private static String ip="localhost"; 
    private static int port=1440; 
    private static String client="Client"; 
    private static String server="Server"; 

    public static void main(String[] args) throws Exception 
    { 
     ClientSocketRunner socket_runner=new ClientSocketRunner(); 
     socket_runner.run(); 
    } 

    private void run() throws Exception 
    { 
     Socket client_socket=new Socket(ip, port); 
     OutputStream os=client_socket.getOutputStream(); 
     InputStream is=client_socket.getInputStream(); 

     PrintStream make_output=new PrintStream(os); 
     BufferedReader read_input=new BufferedReader(new InputStreamReader(is)); 

     make_output.println("Hello, I'm the Client"); 
     System.out.println(read_input.readLine()); 
     System.out.println("my port: "+client_socket.getLocalPort()); 

     String line=null; 
     BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in)); 
     // here starts updated code 

     while(true) 
     { 
      if (user_input.ready()) 
      { 
       line=user_input.readLine(); 

       if(line.equals("-1")) { 
       break; 
       } 
       make_output.println(server+": "+line); 
       make_output.flush(); 
       System.out.println("sent"); 
      } 

      while (is.available()>0) 
      { 
       System.out.println(read_input.readLine()); 
      } 
      Thread.sleep(500); 
     } 
    } 
} 
+0

あなたのコードをありがとう、私はそれを試してみましょう。この単純化されたバージョンの後でスレッドを自分自身で調べる予定だった。しかし、私のコードは動作しません。正確に複数の行のために!最初の行は到着しますが、他の行は後で魔法によって到着します... – parsecer

関連する問題