Java入門内検索
Javaトップ
0. はじめに
1. Javaの基礎
1. コンパイル方法・実行方法
2. 予約語
3. 構成
4. データの型と宣言
5. 定数と変数
6. 簡単な演算
7. ディスプレイへの表示
8. 文字列
2. 制御文
1. 順次構造
2. 単一分岐
3. 多重分岐
4. ケース構造
5. 反復構造(while)
6. 反復構造(do)
7. 反復構造(for)
8. 補助制御文
9. 練習問題
10.練習問題
11.多重ループの抜け方
3. 配列
1. 配列とは
2. 配列の宣言と初期化
3. 配列の使用法
4. 練習問題
5. 2次配列と多次元配列
6. 練習問題
4. クラスの基礎
1. クラスとは
2. クラスの作成
3. コンストラクタ
4. 例題
5. 演算子==とequalsメソッド
5. 演算子
1. 演算子の種類
2. インクリメント演算子とデクリメント演算子
3. 複合代入演算子
4. ビット演算子
5. シフト演算子
6. キャスト演算子
7. 順次演算子
8. 条件演算子(三項演算子)
9. instanceof演算子
10.演算子の優先順位
11.式と値
12.条件式と値
13.練習問題
6. オブジェクト指向とは
1. オブジェクト指向とクラス
2. 継承
3. カプセル化
4. ポリモーフィズム
7. クラス
1. thisキーワード
2. public, protected, private
3. 静的変数・静的メソッド・静的ブロック
4. ローカル変数
5. メソッドの引数
6. null
7. 練習問題
8. インナークラス(内部クラス)
9. 無名インナークラス(無名内部クラス)
10. クラスの包含
11. 練習問題
8. 継承
1. 継承とは
2. スーパークラスのコンストラクタ
3. 継承とキャスト
4. スコープ
5. クラスの作成
6. abstract
7. 例題)お絵かきソフト
8. 継承と包含
9. インターフェース
1. インターフェースとは
2. インターフェースの宣言
3. インターフェースの参照
4. インターフェースの修飾子
5. インターフェースの継承
6. インターフェースとinstanceof演算子
10. パッケージ
1. パッケージとは
2. パッケージの宣言
3. クラスパス
4. import
11. 例外
1. 例外とは
2. 例外が起きたら
3. 例外の種類
4. catchブロックの検索
5. throw
6. throws
7. エラーと例外
8. 独自の例外
12. マルチスレッド
1. スレッドとは
2. スレッドのライフサイクル
3. スレッドの作成(Threadクラス)
4. Threadクラスのメソッド
5. スレッドの作成(Runnableインターフェース)
6. 同期
7. デッドロック
8. スレッド間の通信
13. ガーベージコレクター
1. ガーベージコレクターとは
2. ガーベージコレクターの実行
3. finalize
14. 有用な(?)クラス群
1. Math
2. Random
3. System
4. Vector
5. Stack
6. Hashtable
7. Enumeration
8. String
9. StringTokenizer
10. Object
11. Number
12. Byte
13. Short
14. Integer
15. Long
16. Float
17. Double
18. BigInteger
19. BigDecimal
20. Character
21. Date
22. Calendar
15. 入出力
1. ファイルとディレクトリ
2. ストリームの種類
3. 文字ストリーム
4. Reader
5. CharArrayReader
6. StringReader
7. InputStreamReader
8. FileReader
9. BufferedReader
10. Writer
11. CharArrayWriter
12. StringWriter
13. OutputStreamWriter
14. FileWriter
15. PrintWriter
16. BufferedWriter
17. バイトストリーム
18. InputStream
19. ByteArrayInputStream
20. FileInputStream
21. FilterInputStream
22. BufferedInputStream
23. DataInputStream
24. OutputStream
25. ByteArrayOutputStream
26. FileOutputStream
27. FilterOutputStream
28. BufferedOutputStream
29. PrintStream
30. DataOutputStream
31. ランダムアクセスファイル
32. スレッド間通信 PipedInputStream PipedOutputStream
33. クラスの保存 ObjectInputStream ObjectOutputStream Serializable
34. StreamTokenizer
35. 標準入出力 キーボードからの入力(標準入力) 標準出力 標準エラー出力
36. 練習問題
16. ネットワーク
1. インターネットアドレス
2. TCP/IP通信
3. UDP通信
4. URL
5. 練習問題
6. マルチキャスト
7. RMI
17. 中間試験
1. 問題:Webサーバーを作りなさい
2. HTTPプロトコル
3. クラス設計
4. 解答例
18. AWT
1. AWTとは
2. Component
3. Container
4. Frame
5. Button
6. レイアウト
7. BorderLayout
8. FlowLayout
9. GridLayout
10. CardLayout
11. nullレイアウト
12. イベントとイベントリスナー
13. ActionListener
14. Panel
15. Label
16. CheckBoxとItemListener
17. CheckBoxGroup
18. Choice
19. List
20. TextFieldとTextListener
21. TextArea
22. ScrollbarとAdjastmentListener
23. Canvas
24. 練習問題(計算機)
25. Point
26. Dimension
27. Color
28. Font
29. Graphics
30. 練習問題
31. 練習問題
32. ダブルバッファ
33. イベント その2 ActionEvent ItemEvent AdjustmentEvent
34. KeyListenerとKeyEvent InputEvent
35. MouseListenerとMouseEvent
36. MouseMotionListener
37. FocusListenerとFosusEvent
38. WindowListenerとWindowEvent
39. ComponentListenerとComponentEvent
40. ContainerListenerとContainerEvent
41. アダプタクラスとインナークラス
42. 無名インナークラス
43. 練習問題 お絵かき
44. WindowとDialog、FileDialog
45. メニュー
46. ポップアップメニュー
47. ショートカット
48. カーソル
19. Java Applet
1. Java Appletとは
2. 最初のJava Applet
3. Appletクラス
4. Appletクラスのライフサイクル
5. AppletContext
6. イメージ
7. パラメーター
8. 練習問題 スライドショー
9. Jarファイル
10. 練習問題 時計
20. その他のチップス
1. Javaから別のプログラムを実行させる
2. StringBuffer
3. 環境変数の取得
4. 基数表記
5. インスタンスのコピー
6. 値渡しと参照渡し
7. クラスオブジェクトの比較
21. 修了試験 ↓これより下は工事中です。
1. 考え中
2. 考え中
3.
4.
22. そしてその後は・・・
1. ヒューマンアカデミー Javaプログラマー本科
2. Appli-Style.com iアプリ作成に挑戦
3. SJC-A 受験チケット申込
このページの先頭に戻る
トップページに戻る
このページの先頭に戻る
トップページに戻る
|
前ページへ :
トップへ :
次ページへ
- 05. 練習問題
-
問題
計算サーバーとクライアントを作成しなさい。サーバーは起動時にクライアントからの接続ポートを引数として
受け取り、そのポートで接続を待つ。クライアントからの接続があると、新しく計算用のスレッドを起動する。
計算スレッドが起動している時に別のクライアントが接続されると、別のクライアントが使用中であるエラーメッセージを
送信するスレッドを起動する。
サーバーは、double型の数値を1つ保持しておき、クライアントが接続されるとその数値をクライアントに
送る。クライアントはキーボードから入力された「+10」とか、「/4」といった計算式を受け取り、「++19」や
「@5」といった記述間違えでないことを確認後、サーバーに送る。サーバーは送られてきた計算式に従って
計算し、解答を保持すると共に、クライアントに送り返す。
+などの記号がなく、直接数値の場合は、その数値に置き換える。
クライアントはキーボードから「quit」もしくは「exit」(大文字小文字は区別しない)と入力された場合は
サーバーとディスコネクトする。
import java.io.*;
import java.net.*;
import java.util.*;
class Server{
// 接続されていればtrueになる。
private static Boolean bConnect = Boolean.FALSE;
// データ
private static double dNum = 0D;
public static void main(String args[]){
try{
// ポート番号の取得
int nPort = Integer.parseInt(args[0]);
if( nPort < 1000 || nPort > 65535 )
throw new NumberFormatException();
// サーバーソケット作成
ServerSocket serverSocket = new ServerSocket(nPort);
for( int i = 1 ; true ; i++ ){
// 接続を待機する
Socket sock = serverSocket.accept();
// スレッドを作って、開始する
synchronized(bConnect){
// すでに接続されているクライアントがあるか?
if( bConnect == Boolean.TRUE ){
// 断るスレッドを作成
(new BusyThread(sock)).start();
}
else{
bConnect = Boolean.TRUE;
// 計算スレッドを作成
(new ConnectionThread(sock)).start();
}
}
}
}catch(NumberFormatException e){
System.err.println("引数はポート番号です。1000〜65535までの数字を設定してください。");
}catch(IndexOutOfBoundsException e){
System.err.println("引数はポート番号です。1000〜65535までの数字を設定してください。");
}catch(IOException e){
System.err.println("入出力エラーです\n" + e);
}catch(Exception e){
System.err.println(e);
}
}
// 接続フラグをfalseにする
// 別のスレッドからbConnectをアクセスする可能性があるため、synchronized
public static void connectionTerminate(){
synchronized(bConnect){
bConnect = Boolean.FALSE;
}
}
// データの取得
// クライアントは1つなので、別々のスレッドからアクセスされる心配はないので、synchronizedにしていない
public static double getNum(){
return dNum;
}
// データの設定
// クライアントは1つなので、別々のスレッドからアクセスされる心配はないので、synchronizedにしていない
public static void setNum(double d){
dNum = d;
}
}
// ユーザーがすでに使用中の場合のクラス
class BusyThread extends Thread{
// 再接続をするように施すメッセージ
static private String strMessage = "ただいま別のユーザーが使用中です\r\n" +
"しばらく待ってから再接続をしてください。\r\n";
// 終了の合図
static private String strDisconnect = "disconnect";
private Socket sock;
BusyThread(Socket s){
sock = s;
}
public void run(){
try{
// ストリーム作成
OutputStream os = sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
// データ送信
dos.writeUTF(strMessage);
dos.writeUTF(strDisconnect);
dos.flush();
// クローズ
dos.close();
}catch(Exception e){
System.err.println(e);
}
}
}
// 計算するスレッド
class ConnectionThread extends Thread{
// 終了の合図
static private String strDisconnect = "disconnect";
private Socket sock;
ConnectionThread(Socket s){
sock = s;
}
public void run(){
try{
// ストリーム作成
InputStream is = sock.getInputStream();
OutputStream os = sock.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
// 継続フラグ
boolean bContinue = true;
while( bContinue ){
// データ送信
String str1 = "ただいまの値は、 " + Server.getNum() + " です。";
String str2 = "計算式を入力してください";
dos.writeUTF(str1);
dos.writeUTF(str2);
dos.flush();
char ch = dis.readChar();
double d = dis.readDouble();
switch( ch ){
case '+': // 加算
Server.setNum( Server.getNum() + d );
break;
case '-': // 減算
Server.setNum( Server.getNum() - d );
break;
case '*': // 乗算
Server.setNum( Server.getNum() * d );
break;
case '/': // 除算
Server.setNum( Server.getNum() / d );
break;
case '%': // 剰余
Server.setNum( Server.getNum() % d );
break;
case '!': // 置き換え
Server.setNum( d );
break;
case '\0': // 終了コード
bContinue = false;
break;
default:
System.err.println("エラー:予期せぬコードが送られてきました");
}
}
// クローズ
os.close();
is.close();
sock.close();
}catch(IOException e){
System.err.println("入出力エラーです\n" + e);
}catch(Exception e){
System.err.println(e);
}
// 接続終了
Server.connectionTerminate();
}
}
import java.io.*;
import java.net.*;
import java.util.*;
class Client{
// 終了の合図
static private String strDisconnect = "disconnect";
public static void main(String args[]){
try{
// サーバー名の取得
String strServer = args[0];
// ポート番号の取得
int nPort = Integer.parseInt(args[1]);
// サーバーに接続
Socket sock = new Socket(strServer, nPort);
// ストリーム作成
InputStream is = sock.getInputStream();
OutputStream os = sock.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
// キーボードからの入力用ストリーム
InputStreamReader isr = new InputStreamReader(System.in);
StreamTokenizer st = new StreamTokenizer(isr);
st.lowerCaseMode(true); // 小文字に変換する
st.ordinaryChar('/'); // 標準で'/'はコメント文字になっている
// 文字列変数定義
String strSock1; // サーバーからの受信用
String strSock2; // サーバーからの受信用
while(true){
// サーバーからのデータ受信し、表示
strSock1 = dis.readUTF();
System.out.println(strSock1);
// 2行目が"disconnect"ならば終了
strSock2 = dis.readUTF();
if( strSock2.equals(strDisconnect) ){
// 終了なら、クローズして終了
is.close();
sock.close();
System.exit(0);
}
System.out.println(strSock2);
char ch = '\0';
Double dNum = new Double(Double.NaN);
// キーボードから入力
if(st.nextToken() != st.TT_EOF){
// 最初のトークンのエラーチェック
// 文字列か?
if( st.ttype == st.TT_WORD ){
// 終了か?
if( st.sval.equals("exit") || st.sval.equals("quit") ){
// 終了なら、終了コード(0)を送って、クローズして終了
dos.writeChar('\0');
dos.writeDouble(0D);
is.close();
sock.close();
// 終了
System.exit(0);
}
// ヘルプか?
else if( st.sval.equals("help") )
// ヘルプメッセージ
helpMsg();
// 終了じゃなければエラー
else{
// 最初のトークンが記号じゃなければフォーマット間違い
errMsg();
}
}
// 数値か?
else if( st.ttype == st.TT_NUMBER ){
// 数値置き換えの記号は'!'にする
ch = '!';
// 数値なら置き換え
dNum = new Double(st.nval);
}
// 記号なら
else{
switch((char)st.ttype){
case '+': // 加算
case '-': // 減算
case '*': // 乗算
case '/': // 除算
case '%': // 剰余
ch = (char)st.ttype;
break;
default:
// あり得ない記号
errMsg();
}
}
}
// 次のトークン
if( dNum.isNaN() && st.nextToken() != st.TT_EOF ){
// 数値か?
if( st.ttype != st.TT_NUMBER ){
// 次のトークンが数値じゃなければフォーマット間違い
errMsg();
}else{
// 数値なら
dNum = new Double(st.nval);
}
}
// 式をサーバーに送る
// 数式が入力されているか?
if( ch != '\0' && !dNum.isNaN() ){
// 数式を送る
dos.writeChar(ch);
dos.writeDouble( dNum.doubleValue() );
}
// フラッシュ
dos.flush();
}
}catch(NumberFormatException e){
System.err.println("引数はサーバー名とポート番号です。");
}catch(IndexOutOfBoundsException e){
System.err.println("引数はサーバー名とポート番号です。");
}catch(UnknownHostException e){
System.err.println("サーバー(" + args[0] + ")が見つかりません");
}catch(IOException e){
System.err.println("入出力エラーです" + e);
}catch(Exception e){
System.err.println(e);
}
}
// フォーマット違いのエラーメッセージ表示
protected static void errMsg(){
System.err.println("計算式のフォーマットが違います。");
System.err.println("例) +10\r\n");
}
// ヘルプメッセージ表示
protected static void helpMsg(){
System.err.println("+,-などの記号の後に、数字を入力します。");
System.err.println("例) +10");
System.err.println("+ : 加算");
System.err.println("- : 減算");
System.err.println("* : 乗算");
System.err.println("/ : 除算");
System.err.println("% : 剰余");
System.err.println();
}
}
|
C:\Java\>java Server 10000
C:\Java\>java Client 127.0.0.1 1000
ただいまの値は、 0.0 です。
計算式を入力してください
100
ただいまの値は、 100.0 です。
計算式を入力してください
+3
ただいまの値は、 103.0 です。
計算式を入力してください
%50
ただいまの値は、 3.0 です。
計算式を入力してください
/7
ただいまの値は、 0.42857142857142855 です。
計算式を入力してください
C:\Java\>java Client 127.0.0.1 1000
ただいま別のユーザーが使用中です
しばらく待ってから再接続をしてください。
|
前ページへ :
トップへ :
次ページへ
|