• 締切済み

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(); // ソケットとストリームをクローズする } } クライアント側と実行結果は以下の回答欄にのせます。

みんなの回答

  • santa1359
  • ベストアンサー率100% (1/1)
回答No.1

◎クライアント側 import java.io.*; // ソケットに必要 import java.net.*; // IOException,Input/OutputStreamに必要 public class UMLClient { private static final int BUFSIZE = 32; // 受信バッファのサイズ public static void main(String[] args) throws IOException { // 引数の数が正しいかどうかを調べる if (args.length != 1) throw new IllegalArgumentException("Parameter(s): <Port>"); int servPort = Integer.parseInt(args[0]); // ポート番号 // サーバの接続要求を受け付けるサーバソケットを作成する ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize = 0; // 受信したメッセージのサイズ byte[] byteBuffer = new byte[BUFSIZE]; // 受信バッファ Socket clntSock = servSock.accept(); // サーバ接続を取得する System.out.println("Handling client at" + clntSock.getInetAddress().getHostAddress() + "on port" + clntSock.getPort()); InputStream in = clntSock.getInputStream(); OutputStream out = clntSock.getOutputStream(); // クライアントが接続をクローズし、-1が返されるまで受信する String spare; // 送信する文字列 String change = null; // 受信した文字列 while ((recvMsgSize = in.read(byteBuffer)) != -1) // バイトを文字列に変換 change = new String(byteBuffer); System.out.println(change); // 送られたコマンドが正しいかどうか判断 if(change.equals("put") == true){ spare = "OK"; byte[] Buffer = spare.getBytes(); out.write(Buffer, 0, 2); }else if(change.equals("active") == true){ spare = "OK"; byte[] Buffer = spare.getBytes(); out.write(Buffer, 0, 2); }else if(change.equals("control") == true){ spare = "OK"; byte[] Buffer = spare.getBytes(); out.write(Buffer, 0, 2); }else if(change.equals("join") == true){ spare = "OK"; byte[] Buffer = spare.getBytes(); out.write(Buffer, 0, 2); }else if(change.equals("cut") == true){ spare = "OK"; byte[] Buffer = spare.getBytes(); out.write(Buffer, 0, 2); }else{ spare = "NG"; byte[] Buffer = spare.getBytes(); out.write(Buffer, 0, 2); } System.out.println(spare + "を送りました。"); //out.write(byteBuffer, 0, recvMsgSize); clntSock.close(); // ソケットをクローズする。このクライアントとの接続は終了 } } ◎実行結果 送信するコマンドを入力してください>>put 入力したものはput クライアントが正常に受信できたか確認しています… �null 正しくコマンドが受信できませんでした。再送してください。