• ベストアンサー

コンソール入力内容をエコーさせる

すぐに回答を! Javaを使い、コンソールで文字列を入力して それをエコーさせるというプログラムを作成しています。 私のつくったプログラムは以下の通りです。 ●クライアント側 import java.io.*; import java.net.*;  public class UMLClient {  public static void main(String[] args) throws IOException {   // 引数の数が正しいかどうかを調べる   if (args.length != 2)   throw new IllegalArgumentException("Parameter(s): <Server>   <Port>");   String command = null; // コマンド名   String server = args[0]; // サーバ名またはIPアドレス   // ポート番号が指定されていない場合は、ポート番号を7にする   int servPort = (args.length == 2) ? Integer.parseInt(args   [1]) : 7;   // データ入力の準備。入力されたバイト数が使えるようにバッフ  ァリングされた文字列ストリームを作成する   BufferedReader input = new BufferedReader (new         InputStreamReader(System.in), 1);   for (;;) {    System.out.print("送信するコマンドを入力してください>>");    System.out.flush(); // 強制出力    command = input.readLine(); // コマンド(文字列)の入力    // 正しいコマンドが入力されたかの確認    if (command == "put" ){     break;    }else if (command == "active"){     break;    }else if (command == "control"){     break;    }else if (command == "join"){     break;    }else if (command == "cut"){     break;    }else{     System.out.println("正しいコマンドを入力してください");    }   }   // サーバの指定されたポートに接続するソケットを作成する   Socket socket = new Socket(server, servPort);   System.out.println("Connected to server...sending echo     string");   // 入力されたコマンド(文字列)をバイトに変換する   byte[] byteBuffer = command.getBytes();   InputStream in = socket.getInputStream();   OutputStream out = socket.getOutputStream();   out.write(byteBuffer); // エンコードされた文字列をサーバに送  信する   // サーバから同じ文字列を受信する   int totalBytesRcvd = 0; // ここまでに受信した合計バイト数   int bytesRcvd; // 前回の読み込みで受信したバイト数   while (totalBytesRcvd < byteBuffer.length) {    if ((bytesRcvd = in.read(byteBuffer, totalBytesRcvd,      byteBuffer.length - totalBytesRcvd)) == -1)    throw new SocketException("Connection closed          prematurely");    totalBytesRcvd += bytesRcvd;   }   System.out.println("Received: " + new String(byteBuffer));   socket.close(); // ソケットとストリームをクローズする  } } ※サーバ側は文字列の関係で、書けませんが、 今回のエラーは明らかにクライアント側の問題だと考えています。 これを実行しても、添付ファイルのような結果です。 これを改善するためにはどこを修正すべきでしょうか。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1さんのおっしゃるので正解だと思います。こういうことですよね? }else if (command == "cut"){ ではなく、 }else if (command.equals("cut")){ が正解だと。

santa1359
質問者

お礼

おっしゃる通りやってみたところ、 正しく動作することができました。 ありがとうございます。

その他の回答 (1)

回答No.1

自信なし。 「Stringは参照型なので演算子ではなくequalsメソッドを使わなければならないのに使ってない」のが原因な気がする。

santa1359
質問者

お礼

equalsメソッドを使用したところ、 正常に動作しました。ありがとうございました。

関連するQ&A

  • TCPでメッセージの送受信

    TCP/IPでメッセージの送受信をしようとしています。 「サーバ側から特定(5つ)のコマンドのいづれかを送信する。 クライアント側で受信し、正しいコマンドが受信できたか判断をし その結果(OKかNGか)をサーバ側に送信する」 というプログラムです。正しいコマンドが受信できたか判断をする箇所が 思うようにいきません。 アドバイスお願いします。 ◎サーバ側 import java.io.*; import java.net.*; public class UMLServer { public static void main(String[] args) throws IOException { // 引数の数が正しいかどうかを調べる if (args.length != 2) throw new IllegalArgumentException("Parameter(s): <Server> <Port>"); String command = null; // コマンド名 String server = args[0]; // サーバ名またはIPアドレス // ポート番号が指定されていない場合は、ポート番号を7にする int servPort = (args.length == 2) ? Integer.parseInt(args[1]) : 7; // データ入力の準備。入力されたバイト数が使えるようにバッファリングされた文字列ストリームを作成する BufferedReader input = new BufferedReader (new InputStreamReader(System.in), 1); for (;;) { System.out.print("送信するコマンドを入力してください>>"); command = input.readLine(); // コマンド(文字列)の入力 System.out.println("入力したものは" + command); // 正しいコマンドが入力されたかの確認 if (command.equals("put") == true){ break; }else if(command.equals("active") == true){ break; }else if(command.equals("control") == true){ break; }else if(command.equals("join") == true){ break; }else if(command.equals("cut") == true){ break; }else{ System.out.println("正しいコマンドを入力してください"); } } // サーバの指定されたポートに接続するソケットを作成する Socket socket = new Socket(server, servPort); System.out.println("クライアントが正常に受信できたか確認しています…"); // 入力されたコマンド(文字列)をバイトに変換する byte[] byteBuffer = command.getBytes(); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(byteBuffer); // エンコードされた文字列をサーバに送信する int ch[] = new int[2]; // 正しいコマンドが受信されたかの確認 String answer[] = new String[2]; for(int i = 0; i < 2; i++){ ch[i] = in.read(); //answer[i] = Integer.toString(ch[i]); byte[] bytes = {(byte) ch[i]}; answer[i] = new String(bytes); if(ch[i] == -1){ break; } } System.out.println(answer[0] + answer[1]); if(answer.equals("OK") == true){ System.out.println("正しくコマンドが受信されました"); }else{ System.out.println("正しくコマンドが受信できませんでした。再送してください。"); } // サーバから同じ文字列を受信する //int totalBytesRcvd = 0; // ここまでに受信した合計バイト数 //int bytesRcvd; // 前回の読み込みで受信したバイト数 //while (totalBytesRcvd < byteBuffer.length){ //if ((bytesRcvd = in.read(byteBuffer, 0, 2)) == -1) //throw new SocketException("Connection closed prematurely"); //totalBytesRcvd += bytesRcvd; //} //System.out.println("Received: " + new String(byteBuffer)); socket.close(); // ソケットとストリームをクローズする } } クライアント側と実行結果は以下の回答欄にのせます。

  • TCPプログラミング

    次のコードを入力したのですが、コンパイルできません。 エラーについても良く分かりません。 import java.net.*; import java.io.*; public class TCPEchoClient{ public static void main(String[] args)throws IOException{ if((args.length < 2)||(args.length > 3)) throw new IllegalArgumentException("Parameter(s):<Server><Word>[<Port>]"); String server = args[0]; byte[] byteBuffer = args[1].getBytes(); int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; Socket socket = new Socket(server,servPort); System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(byteBuffer); int totalBytesRcvd = 0; int bytesRcvd; while(totalBytesRcvd < byteBuffer.length){ if(bytesRcvd = in.read(byteBuffer, totalBytesRcvd, byteBuffer.length - totalBytesRcvd) == -1) throw new SocketException("Connection closed prematurely"); totalBytesRcvd += bytesRcvd; } System.out.println("Received: " + new String (byteBuffer)); socket.close(); } } これについて、 if(bytesRcvd = in.read(byteBuffer, totalBytesRcvd, byteBuffer.length - totalBytesRcvd) == -1) この行にエラーがあるらしいです。 どう解決していいのか分かりません。 どなたか説明してもらえませんか。

    • ベストアンサー
    • Java
  • TCPプログラミング

    以下のプログラムをコンパイルして実行したら Exception in thread "main" java.lang.IllegalArgumentException: Paraneter(s):<Server> <Word> [<Port>] at TCPEchoClient.main(TCPEchoClient.java:9) というメッセージが表示されました。 このメッセージの意味が全く分かりません。 分かる方がいらっしゃいましたら教えてください。 お願いします。 本来なら Received:****(←****は自分が指定した文字列) となるはずなんですが… このプログラムはTCPを使ってエコーサーバと通信するクライアントです。 import java.net.*; import java.io.*; public class TCPEchoClient{ public static void main(String[] args)throws IOException{ if((args.length < 2)||(args.length > 3)) throw new IllegalArgumentException("Parameter(s):<Server><Word>[<Port>]"); String server = args[0]; byte[] byteBuffer = args[1].getBytes(); int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; Socket socket = new Socket(server,servPort); System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(byteBuffer); int totalBytesRcvd = 0; int bytesRcvd; while(totalBytesRcvd < byteBuffer.length){ if(bytesRcvd = in.read(byteBuffer, totalBytesRcvd, byteBuffer.length - totalBytesRcvd) == -1) throw new SocketException("Connection closed prematurely"); totalBytesRcvd += bytesRcvd; } System.out.println("Received: " + new String (byteBuffer)); socket.close(); } }

  • TCPのプログラムで例外エラーが出て困っています

    java eclipeを使って通信のプログラムを作ろうとしています。 参考にしている本は、TCP/IPソケットプログラミングjava編です。 本に書かれてるソースコードのとおりに入力したら、 Exception in thread "main" java.lang.IllegalArgumentException: Parameter(s): <Server> <word> [<Port>] at socket_33.TCPEchoClient.main(TCPEchoClient.java:15) というエラーが出ました。 このエラーを調べると、 「不正な引数、または不適切な引数をメソッドにわたしたことを示すためにスローされる」とかかれていました。 また、 <Server> <word> [<Port>] に何か文字を入力すればよいとも書かれていました。 具体的には、何を入力すればよいのでしょうか? 他のページを見て試してみても、例外エラーがとれません。 下にソースコードを載せますので、おかしな部分がありましたら、 そちらのご指導もお願いします。 package socket_33; import java.net.*; // Socketに必要 import java.io.*; // IOException,Input/OutputStreamに必要 public class TCPEchoClient { /** * @param args */ public static void main(String[] args) throws IOException { if ((args.length < 2) || (args.length > 3)) // 引数の数が正しいかどうかを調べる throw new IllegalArgumentException("Parameter(s): <Server> <word> [<Port>]"); String server = args[0]; // サーバ名またはIPアドレス // デフォルトの文字エンコード方式を使って入力Stringをバイトに変換する byte[] byteBuffer = args[1].getBytes(); int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; // サーバの指定されたポートに接続するソケットを作成する Socket socket = new Socket(server, servPort); System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(byteBuffer); // エンコードされた文字列をサーバに送信する // サーバから同じ文字列を受信する int totalBytesRcvd = 0; // これまでに受信した合計バイト数 int bytesRcvd ; // 前回の読み込みで受信したバイト数 while (totalBytesRcvd < byteBuffer.length){ if ((bytesRcvd = in.read(byteBuffer,totalBytesRcvd,byteBuffer.length - totalBytesRcvd)) == -1) throw new SocketException("Connection closed prenmaturely"); totalBytesRcvd += bytesRcvd; } System.out.println("Received: " + new String(byteBuffer)); socket.close(); // ソケットとストリームをクローズする } }

  • javaプログラム初心者です。

    入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }

  • コマンドプロンプトでひらがなの入力が出来ません。

    普段グーグル日本語入力を使っています。 OS XPsp2 import java.io.*; class Mojiretuate { public static void main(String[] args) throws IOException { String str = "こんにちは"; String str2; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列当てゲームです。"); System.out.println("答えは何かのあいさつです。"); for(;;){ System.out.println("\n入力"); str2 = br.readLine(); System.out.println("入力文字列の長さ:" + str2.length()); if(str.equals(str2)){ System.out.println("正解です"); break; } else if(str2.length() > str.length()){ System.out.println("長すぎます。"); } else if(str2.length() == str.length()){ System.out.println("長さはあっています。"); } else{ System.out.println("短すぎます。"); } } System.out.println("終了"); } }

    • ベストアンサー
    • Java
  • コマンドラインで配列0~1番目入力したときは?

    使う言語はJava 例えばこんな感じで入力した場合、コマンドラインの配列0~1番目を入力したときコマンドラインでの配列1番目の文字列を値を出力するにはどうしたらいいのでしょうか? コマンドラインを使ってのサンプルソースがあんまり無かった為質問します。 まだまだ初心者脱却していないのでご指導ご鞭撻のほどお願いします。 お早い回答お待ちしています。 java Sample 2012年 1月 1月 考えたサンプルソースはこうです。 public class Ensyuu158 { /** * @param args */ public static void main(String[] args) { for(int i=0; i<args.length; i++){ if(args[i].equals(args[0])){ methodA(args[0]); }else if(args[i].equals(args[1])){ methodB(args[1]); } } }     //コマンドライン配列0~1番目が入力されたら1番目だけの文字列の値を出力する private static void methodB(String str) { System.out.println(str); }     //コマンドラインでの配列0番目が入力されたら0番目だけの文字列の値と文字列を出力したい private static void methodA(String str) { System.out.println(str+"月"); } } }

  • 文字入力チェック

    お世話になります、JAVA言語について勉強中の佐藤と申します。 今回は文字列のチェックを行いたいと思い、ロジックを組んでみました。 String sEnzanshi; if(args.length==3){ }else{ System.out.println("入力パラメータがおかしいですよ"); return; } sEnzanshi= args[2]; System.out.print(sEnzanshi); //第3パラメータチェック if(sEnzanshi == "add"){ }else if(sEnzanshi == "min"){ }else if(sEnzanshi == "mul"){ }else if(sEnzanshi == "div"){ }else{ System.out.println("第3パラメータが不正です"); return; } args[2]の内容が"add"、"min"、"mul"、"div"であれば次処理へ、それ以外はエラーとするようなロジックを組んだつもりです。 ですが、結果は"add"と入力してもエラーで返ってきてしまいます。 文字列チェックの前にSystem.out.printでargs[2]の内容が正しいか確認しましたが、addと正しく出力されました。 原因が分かる方はいらっしゃいますでしょうか? 宜しくお願い致します。

  • javaサーバーとポートを入力してメッセージ

    こんにちは、java初心者なのですが、やり方がいまいちわかってないので教えてください。 このプログラムでは、プロンプトからホストナンバーを入力して、フレームが表示されるようになってるんですが、実行するときに、フレーム(swing)を先に表示させて、サーバーとポートを入力してから 数字などを入力できるようにしたいのですが、どうしたらいいのかわからないので教えてください。 サーバーのクラス public class ThreadedEchoServer { public static void main(String[] args) { int i = 1; try { ServerSocket s = new ServerSocket(7776); for (;;) { Socket incoming = s.accept(); System.out.println("Spawning " + i); new ThreadedEchoHandler(incoming, i).start(); i++; } } catch (Exception e) { System.out.println(e); } } } class ThreadedEchoHandler extends Thread { private Socket incoming; private int counter; public ThreadedEchoHandler(Socket i, int c) { incoming = i; counter = c; } public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(incoming.getOutputStream(), true); out.println("Hello! Please send me an number (0 to exit)."); boolean done = false; while (!done) { String str = in.readLine(); if (str == null) done = true; else { try { int i = Integer.parseInt(str); if (i == 0) { out.println("End !!!"); done = true; break; } String forClient = (i % 2) == 0 ? " You are wrong " : " You are write "; out.println(forClient); } catch (Exception e) { out.println("Please send a number!"); } } } incoming.close(); } catch (Exception e) { System.out.println(e); } } }

    • ベストアンサー
    • Java
  • 変数のキーボード入力について

    何度も質問してすみません。javaについて質問できるのここしかないんで・・・。早速質問なのですが、変数のキーボードから入力する方法で import java.io.*; class Sample4 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力してください"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(str + "が入力されました"); } } とメモ帳に保存して、コンパイルしたら【文字列を入力してください】(【】は実際には入力してません)とちゃんと出てくるのに次の行にキーボードから入力すると日本語入力が出来なくなります。コマンドプロンプトには日本語入力できないのですか?教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう