2017-12-17 9 views
0

Javaを学習しています。クライアント - サーバーアプリケーションの例を書いています。 sokcket接続は問題ありません。クライアントアプリケーションの2番目のメッセージまでは正常です。 サーバーには届きません。別のクライアントを起動すると、最初のメッセージで成功し、2番目のメッセージで失敗します。Javaネットワーククライアントはメッセージを1つだけ送信します

誰でもアイデアはありますか?前もって感謝します!

Serverコード:

package networking; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server { 

    private static Socket socket; 

    public static void main(String[] args) { 
     try { 

      int port = 25000; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port 25000"); 

      //Server is running always. This is done using this while(true) loop 
      while (true) { 
       //Reading the message from the client 
       socket = serverSocket.accept(); 
       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String incomingMessage = br.readLine(); 
       System.out.println("(((" + incomingMessage); 

       String returnMessage = incomingMessage; 

       //Sending the response back to the client. 
       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 
       bw.write(returnMessage + "\n"); 
       bw.flush(); 
       System.out.println("))) " + returnMessage); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       socket.close(); 
      } catch (Exception e) { 
      } 
     } 
    } 
} 

とクライアント

package networking; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Client { 

    private static Socket socket; 

    public static void main(String args[]) { 
     try { 
      String host = "localhost"; 
      int port = 25000; 
      InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(address, port); 

      //Send the message to the server 
      OutputStream os = socket.getOutputStream(); 
      OutputStreamWriter osw = new OutputStreamWriter(os); 
      BufferedWriter bw = new BufferedWriter(osw); 

      BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); 

      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 

      String message = ""; 
      /* 
      while(!message.equals("q")) { 

       System.out.print("Message: "); 
       message = console.readLine(); 
       bw.write(message + "\n"); 
       bw.flush(); 
       System.out.println("))) " + message); 
       //Get the return message from the server 
       String incomingMessage = br.readLine(); 
       System.out.println("(((" + incomingMessage); 
      } 
      */ 
      for (int i = 0; i < 10; i++) { 
       bw.write(i + "\n"); 
       bw.flush(); 
       System.out.println("))) " + i); 
       String incomingMessage = br.readLine(); 
       System.out.println("(((" + incomingMessage); 
      } 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } finally { 
      //Closing the socket 
      try { 
       socket.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 
+0

サーバーで、作業が完了したらconnを閉じます。それ以外の場合は、DDoSに脆弱になります。 – Penn

答えて

2

あなたwhileサーバーコードに置き忘れ、そして実際に、あなたは2つのwhileループ必要されています。では、クライアント

によっていくつかのメッセージを管理するための新しいクライアント

  • 1を受け入れるための

    • 1を擬似コードは、あなたにそれを与える:

      while (true): 
          accept new client 
          while (client connected): 
           read message from client 
           write back message to client 
          close client socket 
      

      スレッドを使用する場合は、内部スレッドwhileを新しいスレッドに委任する必要があります。

      注:acceptは新しいクライアントが来るまでブロックしています。なぜあなたはクライアントから1つのメッセージしか送信できないのですか?

  • +0

    それは完全に動作します。どうもありがとうございました! –

    +0

    スレッドを使用しない場合、一度に複数のクライアントを使用することはできません... – Penn

    2

    サーバーがこれを処理するように設定されていません。あなたは1行を読んでいて、それを閉じずにGCの接続を破棄しています。サーバは、1行を読み込み、他のすべての行を無視して次の接続を待ち受けます。

    また、スレッドの使用を検討してください。

    +1

    私はスレッドで書き直そうとしますが、その結果が戻ってきます。ありがとう! –

    関連する問題