2017-03-01 3 views
-1

図形のユーザー入力サイズが読み取られ、サーバーに返されるシンプルなクライアントサーバーGUIアプリケーションの作成中に、メソッドdrawShapeが呼び出された後、すべてが停止し、クライアントは(DIM x、y)を受け取ります。ou "1:描画点\ n2:円を描く\ n3 「長方形を描く」これは、出力先のサーバーには返されません(私は一言で試してみましたが)うまくいきませんでした。Java GUIアプリケーションでは、サーバーは最初の要求のみを読み取ります。

私は本当に何が問題なのか分かりません。私は数日間それを苦労しています。 私は値を解析し、スキャナを閉じ、スキャナをチェックし、ループをチェックしました... PrintWriterがOutputStreamレスポンスをサーバに送信しないのはなぜですか?

これはコードです:

public static final int TCP_PORT = 8000; 

public SGPClientThread(Socket sock) throws IOException { 
    this.sock = sock; 

    in = new BufferedReader(new InputStreamReader(sock.getInputStream()),1); 
    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())), true); 

    start(); 
} 

ETFCanvas can = new ETFCanvas(450, 500); 

public void run() { 

    Scanner scan = new Scanner(System.in); 

    System.out.println("Send new request by entering '<NEW>'"); 

    String option = ""; 
    option = scan.nextLine(); 
    out.println("CONNECT##" + option); 

    String read = " "; 
    try { 
     read = in.readLine(); 
    } catch (IOException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 
    if (read.startsWith("<DIM x,y>")) { 
     System.out.println("1:Draw point\n2:Draw circle\n3.Draw rectangle"); 
     // SO FAR SO GOOD! 

>問題が発生した場合は、何も私は がサーバーに送信されることはありません、プリントアウトしようと、それはこれをする必要はありませんされているコードに続いて、単に という単語や何かを単純に送信してみてください。

 **int choice = scan.nextInt(); 
     switch (choice) { 
     case 1: 
      System.out.println("Dimension and color of POINT:x1,y1,color"); 
      System.out.println("Enter X: "); 
      x = scan.nextInt(); 
      System.out.println("Enter Y: "); 
      y = scan.nextInt(); 
      do { 
       try { 
        System.out.println(
          "Enter Color value: ETFCanvas.COLOR_RED;ETFCanvas.COLOR_BLUE;ETFCanvas.COLOR_GREEN"); 
        color = scan.nextInt(); 
       } catch (InputMismatchException e) { 
        System.out.print("Invalid input "); 
       } 
       scan.nextLine(); // clears the buffer 
      } while (color <= 0); 
      scan.close(); 
      String iks = String.valueOf(x); 
      String ipsilon = String.valueOf(y); 
      String kolor = String.valueOf(color); 
      out.println("<POINT x,y,c>##" + iks + "##" + ipsilon + "##" + kolor); 
      break;** 

BLOCKQUOTE

と短いそれを維持するために、私はそれがサークルや四角形を描画するためだけのケース2及び3であるクライアントスレッドの残りの部分を掲示し、ソケットを閉じていませんでした。

ここは私のサーバースレッドコードです。

ETFCanvas can = new ETFCanvas(450, 500); 

public ServerThread(Socket sock, int value) throws IOException { 

    this.sock = sock; 
    this.value = value; 

    // oos = new ObjectOutputStream(sock.getOutputStream()); 
    // ois = new ObjectInputStream(sock.getInputStream()); 
    in = new BufferedReader(new InputStreamReader(sock.getInputStream()),1); 
    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())), true); 
    start(); 

} 

@Override 
public void run() { 

    String line = ""; 
    // 
    try { 
     line = in.readLine(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    // 
    if (line.startsWith("CONNECT##")) { 

     System.out.println("User sent request " + sock.getRemoteSocketAddress().toString() + line); 

     String[] content = line.split("##"); 
     req = content[1]; 
     if (req.equals("<NEW>")) { 
      out.println("<DIM x,y>"); 
     } 
    } else { 
     System.out.println("Bad request [" + sock.getRemoteSocketAddress().toString() + "]: " + line); 

>この部分ティルそれは魔法のように働いている、そしてそれはあなたが読んで、サーバーコードで

} 
    if (line.startsWith("<POINT x,y,c>##")) { 

     System.out.println("User sent request TRY" + sock.getRemoteSocketAddress().toString() + line); 

     String[] dim = line.split("##"); 
     String dimX = dim[1]; 
     String dimY = dim[2]; 
     String dimC = dim[3]; 

     int x = Integer.parseInt(dimX); 
     int y = Integer.parseInt(dimY); 
     int c = Integer.parseInt(dimC); 

     can.drawPoint(x, y, ETFCanvas.COLOR_RED); 
    } else if (line.startsWith("<CIRCLE x,y,r,boja>##")) { 

     String[] dim = line.split("##"); 
     String dimX = dim[1]; 
     String dimY = dim[2]; 
     String dimR = dim[3]; 
     String dimC = dim[4]; 

     int x = Integer.parseInt(dimX); 
     int y = Integer.parseInt(dimY); 
     int r = Integer.parseInt(dimR); 
     int c = Integer.parseInt(dimC); 

     can.drawCircle(x, y, r, ETFCanvas.COLOR_RED); 
    } else if (line.startsWith("<RECTANGLE x,y,w,h,boja>##")) { 

     String[] dim = line.split("##"); 
     String dimX = dim[1]; 
     String dimY = dim[2]; 
     String dimW = dim[3]; 
     String dimH = dim[4]; 
     String dimC = dim[5]; 

     int x = Integer.parseInt(dimX); 
     int y = Integer.parseInt(dimY); 
     int w = Integer.parseInt(dimW); 
     int h = Integer.parseInt(dimH); 
     int c = Integer.parseInt(dimC); 
     can.drawRect(x, y, w, h, ETFCanvas.COLOR_RED); 
     ; 
     try { 
      in.close(); 
      out.close(); 
      sock.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 
} 

}

+1

クラフトとあなたの問題の[MCVE]バージョンを掲載ご検討ください。 –

答えて

0

を描画するためのクライアント 要求を読みません入力からの最初の行はあなたのコードのどこにでも次の行を読むことはありません。

あなたはライン、プロセス、それらを読んで、繰り返すwhileループを使用する必要があります。

boolean shouldProceed = true; 
while (shouldProceed) { 
    line = in.readLine(); 
    if (line.contains(...)) { 
     // do something 
    } else if (line.comtains(...)) { 
     // do something else 
    } else { 
     shouldProceed = false; 
    } 
} 
+0

はい、これは問題を解決しました。最初のin.readLineの前にwhileループを配置しなければなりませんでした。 –

関連する問題