アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムの機能に関しては完成したのですが、
そのプログラムに並行サーバを実装しなくてはいけません。
複数のクライアントからの要求に応えるという動作がしたいのですが、
以下のプログラムをどうするべきでしょうか。
どんなことでもいいので教えていただきたいです。
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件)

/*


* 起動・停止フェーズ
*
* プログラムの概要
* 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.を入力してください");
}
}
}
}
    • good
    • 0

/*


* 制御フェーズ
*
* プログラムの概要
* 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";
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!