PicassoSocketについて

最終更新日付 平成9年6月17日
鈴木健志
  1. 名前

  2. PicassoSocket

  3. 機能概要

  4. PicassoSocketは、standalone java program です。本プログラムを起動すると、表情変化ウィンドウを生成し、無表情の似顔絵を表示します。また、4321番ポートにソケットをオープンし、クライアントからの接続要求を待ち、接続したクライアントから help,niko, mu という文字列のいずれかとCRコードを受信すると、ぞれの文字列に対応した処理を起動します。起動する処理は、 help+CR の場合はクライアントに対してヘルプ文字列を表示します。niko+CRの場合は表情変化ウィンドウに表示中の無表情の似顔絵が笑顔の似顔絵から再度無表情の似顔絵に自立的回復をします。mu+CRの場合は怒った似顔絵から無表情の似顔絵に自立的回復をします。

  5. 場所
  6. 実行方法
  7. コンパイル方法
  8. ソースファイル
// import 文によって Java クラスを省略名で利用できるようにする。
//
import java.awt.*;
import java.net.*;
import java.io.*;
import java.lang.*;

// PicassoSocket クラスは Frame クラスを拡張したクラスで、
// Runnable クラスのインタフェースを実装する。
//
public class PicassoSocket extends Frame implements Runnable {
  static Canvas c;
  static Panel p;
  static Button b;
  static Thread tanim;
  static MediaTracker mt;
  static Image im;
  static Image im_s[] = new Image[11];
  static Image im_a[] = new Image[11];
  static final int _FUTU = 0;
  static final int _NIKO = 1;
  static final int _MU   = 2;
  static int joutai = _FUTU;

// PicassoSocket クラスのコンストラクタ。
// PicassoSocket がインスタンス化されると自動的に実行される。
//
  public PicassoSocket() {
    Toolkit toolkit;

    mt = new MediaTracker(this);
    System.out.println("Start PicassoSocket.");
    setTitle("PicassoSocket");
    setBackground(Color.white);
    resize(300, 320);

    p = new Panel();
    b = new Button("Quit");

    p.add(b);
    p.setBackground(Color.gray);

    setLayout(new BorderLayout());
    add("South", p);

    toolkit = Toolkit.getDefaultToolkit();
    for (int i=0; i<11; i++) {
      im_s[i] = toolkit.getImage("gif/test05_s" + i + ".gif");
      im_a[i] = toolkit.getImage("gif/test05_a" + i + ".gif");
      mt.addImage(im_s[i], 0);
      mt.addImage(im_a[i], 0);
    }
    im = im_s[0];
  }

// paint メソッド。
// paint メソッドは、 java.awt.Component クラスがもつメソッドの一つで、
// java.awt.Component が GUI コンポーネント部品のスーパークラスのため、
// Frame クラスを拡張した PicassoSocket でオーバーライドできる。
//
  public void paint(Graphics g) {
    if (mt.checkID(0)) {
      g.drawImage(im, 50, 40, this);
    } else {
      g.drawString("Now image loding...",  15, 50);
    }
  }

// handleEvent メソッド。
// handleEvent は、 java.awt.Component クラスがもつメソッドの一つで、
// java.awt.Component が GUI コンポーネント部品のスーパークラスのため、
// Frame クラスを拡張した PicassoSocket でオーバーライドできる。
//
  public boolean handleEvent(Event e) {
    if (e.id == Event.WINDOW_DESTROY) {
      dispose();
      System.out.println("End TestSocket.");
      System.exit(0);
      return true;
    } else {
      return super.handleEvent(e);
    }
  }

// action メソッド。
// action は、 java.awt.Component クラスがもつメソッドの一つで、
// java.awt.Component が GUI コンポーネント部品のスーパークラスのため、
// Frame クラスを拡張した PicassoSocket でオーバーライドできる。
//
  public boolean action(Event e, Object o) {
    String label = o.toString();
    System.out.println(label);

    if (e.target instanceof Button && label.equals("Quit")) {
      dispose();
      System.out.println("End TestSocket.");
      System.exit(0);
      return true;
    }

    return true;
  }

// run メソッド。
// run は、 java.lang.Thread クラスがもつメソッドの一つで、 Runnable
// インターフェースを実装した PicassoSocket で呼び出すことができる。
//
  public void run() {

    while (true) {
      try {
 mt.waitForID(0);
      } catch (InterruptedException e) {}

      switch (joutai) {
      case _NIKO:
 for (int j=10; j>=0; j--) {
   im = im_s[j];
   repaint();
   try {
     tanim.sleep(200);
   } catch (InterruptedException e) {
   }
 }
 joutai = _FUTU;
 break;
      case _MU:
 for (int j=10; j>=0; j--) {
   im = im_a[j];
   repaint();
   try {
     tanim.sleep(200);
   } catch (InterruptedException e) {
   }
 }
 joutai = _FUTU;
 break;
      default:
 im = im_s[0];
 repaint();
 try {
   tanim.sleep(500);
 } catch (InterruptedException e) {
 }
      }

    }
  }

// socket メソッド。
// socket メソッドは、まず 4321 番ポートのソケットをオープンします。
// 接続してきたクライアントから文字列+CRコードを受信すると、文字列
// によって指定の処理を実行します。
//
  public void socket() {
    ServerSocket ss = null;
    Socket s;
    InputStream sIn;
    OutputStream sOut;
    int c;
    String str_startup = "A face changing server with PICASSO.\n";
    String str_help = "\nniko  display smile face.\nmu  display angry face.\nhelp  this document.\nquit  disconnection.\n\n";
    String str;
    StringBuffer strbuff = new StringBuffer(20);

    try {
      ss = new ServerSocket(4321, 300);

      while (true) {

 s = ss.accept();
 System.out.println("Start session.");
 sOut = s.getOutputStream();
 for (int i = 0; i < str_startup.length(); i++) {
   sOut.write((int)str_startup.charAt(i));
 }

 sIn = s.getInputStream();
 
 while ((c = sIn.read()) != -1) {
 
   if ( c == 13 ) {
     System.out.println("CR code(13) Found!");
     sIn.read();
     str = strbuff.toString();
     System.out.println("str = \"" + str + "\"");
     strbuff = new StringBuffer(20);
 
     if (str.equals("quit")) {
       System.out.println("strbuff == quit");
       break;
     }
     if (str.equals("help")) {
       System.out.println("strbuff == help");
       for (int i = 0; i < str_help.length(); i++) {
  sOut.write((int)str_help.charAt(i));
       }
     }
     if (str.equals("niko")) {
       System.out.println("strbuff == niko");
       joutai = _NIKO;
     }
     if (str.equals("mu")) {
       System.out.println("strbuff == mu");
       joutai = _MU;
     }

   } else {
 
     strbuff.append((char)c);
   }
 
 }

 System.out.println("End session.");
 sIn.close();
 sOut.close();
 s.close();
      }
    } catch (IOException e) {
      System.err.println("Caugut IOException");
      System.exit(1);
    }
  }

// main メソッド。
// Java プログラムを起動させるために Java インタプリタが最初に呼び出す。
//
  public static void main(String args[]) {
    PicassoSocket ps;

// PicassoSocket クラスをインスタンス化。
    ps = new PicassoSocket();
    ps.show();
// Thread クラスをインスタンス化。
    Thread tanim = new Thread(ps);
    tanim.start();
// socket メソッドの呼び出し。
    ps.socket();
  }
}