プログラムの機能に関しては完成したのですが、
そのプログラムに並行サーバを実装しなくてはいけません。
複数のクライアントからの要求に応えるという動作がしたいのですが、
以下のプログラムをどうするべきでしょうか。
どんなことでもいいので教えていただきたいです。
import java.io.*;
import java.net.*;
public class UMLServerfinal {
@SuppressWarnings("null")
public static void main(String[] args) throws IOException {
/*
* 引数の数が正しいかどうかを調べる
* 引数については以下の3つを指定する
* 1.自身のポート番号
* 2.ルートファイルシステムの名前(uml-root-hardy)
* 3.カーネルの名前(linux.uml)
*/
if (args.length != 3)
throw new IllegalArgumentException("Parameter(s): <Port> <filesystem_name> <kernel_name>");
// 送信する相手のポート番号
int Port = Integer.parseInt(args[0]);
for(;;){
// フェーズ変換に使用する
String mode;
// 入力するコマンド
String command = null;
// データ入力の準備。入力されたバイト数が使えるようにバッファリングされた文字列ストリームを作成する
BufferedReader input = new BufferedReader (new InputStreamReader(System.in), 1);
// 通信の準備
ServerSocket server;
Socket sock = null;
System.out.print("通信を確立する場合は「cot.」 通信を切断する場合は「clo」を入力してください>>");
String tusin;
tusin = input.readLine();
if(tusin.equals("cot.") == true){
// ソケットを作成し、通信の確立
server = new ServerSocket(Port);
sock = server.accept();
// ストリームの作成
OutputStream out = sock.getOutputStream();
InputStream in = sock.getInputStream();
// モードを制御に変更
mode = "seigyo";
プログラムは分割して回答に載せておきます。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
/*
* 起動・停止フェーズ
*
* プログラムの概要
* 1.UMLの起動か停止を指示する。
*/
String kidou = null; // startかstopの入力に使用する
// 起動・停止フェーズの操作
if(mode.equals("kidou") == true){
System.out.println("/////起動・停止フェーズ/////");
System.out.println("起動・停止フェーズに入りました");
System.out.println("ここではUMLの起動・停止を行います");
// コマンド入力
for(; ;){
// コマンドの説明
System.out.print("UMLを起動する場合は「sta.」、停止する場合は「sto.」を入力してください>>");
// コマンド(文字列)の入力
kidou = input.readLine();
System.out.println("入力したものは " + kidou + "です");
// 正しいコマンドが入力されたかの確認
if (kidou.equals("sta.") == true || kidou.equals("sto.") == true){
System.out.println(kidou + "を送信します");
break;
}else{
System.out.println("正しいコマンドを入力してください");
}
}
// 入力されたコマンド(文字列)をバイトに変換する
byte[] kidousendBuffer = kidou.getBytes();
byte[] kidourecvBuffer = new byte[3];
// エンコードされた文字列をサーバに送信する
out.write(kidousendBuffer);
System.out.println("クライアントが正常に受信できたか確認しています…");
String kotae = null; // OKかNGかNOが入るもの
// OKまたはNGを受信する
for(; ;){
in.read(kidourecvBuffer);
if(kidourecvBuffer[2] == '.')
break;
}
// バイトから文字列へ変換する
kotae = new String(kidourecvBuffer);
System.out.println(kotae);
// OKかNGかどうかの確認
if(kidou.equals("sta.") == true && kotae.equals("OK.") == true){
System.out.println("sta.が受信され、ファイルがあるためUMLを起動します");
// モード変換の処理
System.out.println("操作フェーズに移ります");
mode = "sousa";
}else if(kidou.equals("sta.") == true && kotae.equals("NO.") == true){
System.out.println("sta.が受信されましたが、ファイルがないようです");
// モード変換の処理
System.out.println("配置フェーズに移ります");
mode = "haiti";
}else if(kidou.equals("sto.") == true && kotae.equals("OK.") == true){
System.out.println("sto.が正常に受信されました");
// モード変換の処理
System.out.println("制御フェーズに移ります");
mode = "seigyo";
}else{
System.out.println("正しくコマンドが受信できませんでした。再送してください。");
// モード変換の処理
System.out.println("起動・停止フェーズに移ります");
mode = "kidou";
}
}
/*
* 操作フェーズ
*
* プログラム概要
* 1.UMLの標準入出力を取得する。
* 2.UMLをコマンド操作する。
*/
// 操作フェーズの操作
if(mode.equals("sousa") == true){
System.out.println("/////操作フェーズ//////");
System.out.println("操作フェーズに切り替わりました");
/*
* 操作フェーズの操作を行う。
*/
// 制御フェーズへ切り替わる操作
String sousa = null;
byte[] sousaBuffer = new byte[4];
for(;;){
System.out.print("制御フェーズへ切り替わる場合は「fin.」コマンドを入力してください>>");
sousa = input.readLine();
if(sousa.equals("fin.") == true){
// 文字列をバイト配列に変換
sousaBuffer = sousa.getBytes();
// コマンドの送信
out.write(sousaBuffer);
// 制御フェーズへ切り替わる
System.out.println("制御フェーズに移ります");
mode = "wait";
break;
}else{
System.out.println("finishコマンド以外が入力されました");
}
}
}
// 通信切断する場合
}else if(tusin.equals("col.") == true){
// 通信の切断
System.out.println("//////通信切断/////");
sock.close(); // 接続の切断
System.out.println("接続を切断しました");
}else{
System.out.println("cot.かclo.を入力してください");
}
}
}
}
No.1
- 回答日時:
/*
* 制御フェーズ
*
* プログラムの概要
* 1.通信の確立・切断を行う。
* 2.それぞれの状態へとコマンドで切り替わる。
*/
if(mode.equals("seigyo") == true){
System.out.println("/////制御フェーズ/////");
// OKかNGが入るもの
String answer = null;
for(; ;){
for (;;) {
// コマンドの説明
System.out.println("putコマンドの場合は[put.] activeコマンドの場合は[act.] controlモードの場合は[con.]");
System.out.print("送信するコマンドを入力してください>>");
// コマンド(文字列)の入力
command = input.readLine();
System.out.println("入力したコマンドは" + command + "です。");
// 正しいコマンドが入力されたかの確認
if (command.equals("put.") == true || command.equals("act.") == true || command.equals("con.") == true){
System.out.println("正しいコマンドが入力されました。");
break;
}else{
System.out.println("正しいコマンドを入力してください");
}
}
// 入力されたコマンド(文字列)をバイトに変換する
byte[] sendBuffer = command.getBytes();
// 受信するバイト
byte[] recvBuffer = new byte[3];
// 文字列をサーバに送信する
out.write(sendBuffer);
System.out.println("クライアントが正常に受信できたか確認しています…");
// OKまたはNGを受信する
for(; ;){
in.read(recvBuffer);
if(recvBuffer[2] == '.')
break;
}
// バイトから文字列へ変換する
answer = new String(recvBuffer);
System.out.println(answer);
// OKかNGかどうかの確認
if(answer.equals("OK.") == true){
System.out.println("正しくコマンドが受信されました");
break;
}else{
System.out.println("正しくコマンドが受信できませんでした。再送してください。");
}
}
// それぞれ指定されたフェーズに移る
if(command.equals("put.") == true && answer.equals("OK.") == true){
System.out.println("配置フェーズに移ります");
mode = "haiti";
}else if(command.equals("act.") == true && answer.equals("OK.") == true){
System.out.println("起動・停止フェーズに移ります");
mode = "kidou";
}else if(command.equals("con.") == true && answer.equals("OK.") == true){
System.out.println("操作フェーズに移ります");
mode = "sousa";
}else if(answer.equals("NG.") == true){
System.out.println("コマンド送受信失敗のため制御フェーズに戻ります");
mode = "seigyo";
}
}
/*
* 配置フェーズ
*
* プログラムの概要
* 1.カーネルとルートファイルシステムを送信する。
*/
// 配置フェーズの操作
if(mode.equals("haiti") == true){
System.out.println("/////配置フェーズ/////");
System.out.println("配置フェーズに入りました");
// ルートファイルシステム(uml-root-hardy)の送信
String filename1 = args[1];
// ストリームに書き込むための準備
long totalSize1 = 0;
int len1 = 0;
// ストリームに1024バイトずつ書き込む
byte[] data1 = new byte[1024];
// ストリームの作成
FileInputStream fin1 = new FileInputStream(filename1);
// ファイルの内容を読み出し、送信する
System.out.println("送信ファイル : " + filename1);
System.out.println("送信中・・・");
// ファイルの送信
for(;;){
len1 = fin1.read(data1);
totalSize1 += len1;
out.write(data1, 0, len1);
// 4294971392バイト書き込んだら操作終了
if(totalSize1 >= 4294971392L)
break;
}
fin1.close();
fin1 = null;
System.out.println("uml-root-hardyを送信完了しました");
// カーネル(linux.uml)の送信
String filename2 = args[2];
// ストリームに書き込むための準備
long totalSize2 = 0;
int len2 = 0;
// ストリームに1024バイトずつ書き込む
byte[] data2 = new byte[1024];
//ストリームの作成
FileInputStream fin2 = new FileInputStream(filename2);
//ファイルの内容を読み出し、送信する
System.out.println("送信ファイル : " + filename2);
System.out.println("送信中・・・");
// ファイル送信
for(;;){
len2 = fin2.read(data2);
totalSize2 += len1;// ソケットをクローズ
out.write(data2, 0, len2);
// 2700804バイト送信したら操作終了
if(totalSize2 >= 2700804)
break;
}
fin2.close();
fin2 = null;
System.out.println("linux.umlを送信完了しました");
// ファイル送信が済んだ後の、モード変換の処理
System.out.println("起動・停止フェーズに移ります");
mode = "kidou";
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java java final 1 2022/06/10 22:49
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
JAVA 文字色変更
-
JAVAのDouble型の小数点以下の...
-
曜日の取得方法を教えて下さい!
-
java教えてください。
-
改行の判定方法
-
IPアドレスから組織やプロバイ...
-
全角スペースの判定について
-
nullcline
-
構文解析中にファイルの終わり...
-
java int integer
-
LC発振回路-ループ利得
-
Javaのコマンドライン引数を使...
-
java ファイル操作
-
オブジェクトの中のプロパティ...
-
ダブルクォーテーションのrepla...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
javaで質問です。 文字列2023/2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
EclipseでJava
-
LC発振回路-ループ利得
-
エクセルマクロ文で、赤文字セ...
-
JAVAのDouble型の小数点以下の...
-
JAVA 文字色変更
-
文字列の引き算
-
「続行するには何かキーを押し...
-
nullcline
-
構文解析中にファイルの終わり...
-
java シンボルが見つかりません...
-
改行の判定方法
-
Javaのコマンドライン引数を使...
-
JAVAでの占い
-
曜日の取得方法を教えて下さい!
-
Javaのプログラムがどうしても...
-
IPアドレスから組織やプロバイ...
-
会員情報登録プログラムの作成...
おすすめ情報