// 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();
}
}