/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- WebSim
- init
- setDefault
- paint
- update
- drawAll
- drawBack
- drawKey
- drawPack
- start
- run
- stop
- mousePressed
- loadImages
- getImageArray
- addPacket
- setSSLStatus
- sentOpenKey
- recOpenKey
- recComKey
- getDNS
- getHTTP
- getCert
- mouseClicked
- mouseEntered
- mouseExited
- mouseReleased
package jp.ac.nime.computer.websim;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import jp.ac.nime.computer.*;
/**
* WWWシミュレータメインアプレットクラス
*
* @version 1.00 2003/03/31
* @author Toshikazu Matsumoto Avion Corp.
*/
public class WebSim extends JApplet implements MouseListener,Runnable
{
private Vector m_vcMachine; //表示マシンオブジェクト列
private Image m_imBrow; //ブラウザ画像
private Image m_imServ; //サーバー画像
private Image m_imPacket; //パケット画像
private Image m_imBuil; //認証局画像
private Image m_imKey1; //鍵画像1
private Image m_imKey2; //鍵画像2
private Image m_imKey3; //鍵画像3
private Image[] m_imArray; //画像配列
private Image m_imOff=null; //オフスクリーンイメージ
private Thread m_Thread=null; //スレッド
private Vector m_vcPacket=null; //パケットオブジェクト列
private Vector m_vcHTTP; //HTTPサーバーオブジェクト列
private Vector m_vcDNS; //DNSサーバーオブジェクト列
private Vector m_vcPC; //PCオブジェクト列
private CertServItem m_CertItem;//認証局オブジェクト
private boolean m_bStartSSL =false;
private boolean m_bSentOpenKey =false;
private boolean m_bRecOpenKey =false;
private boolean m_bRecComKey =false;
/**
* アプレット初期化
*/
public void init()
{
this.m_vcMachine=new Vector();
this.m_vcPacket=new Vector();
this.m_imArray=new Image[7];
this.m_vcHTTP=new Vector();
this.m_vcDNS=new Vector();
this.m_vcPC=new Vector();
if(this.loadImages()==false)
{
JOptionPane.showMessageDialog(null, "エラー","画像の読み込みに失敗しました", JOptionPane.ERROR_MESSAGE);
return;
}
this.getContentPane().setBackground(new Color(57,109,165));
this.addMouseListener(this);
this.setDefault();
this.repaint();
}
/**
* 各種デフォルト値の設定
*/
private void setDefault()
{
BrowserItem objBrow=new BrowserItem(this,"192.168.0.4",this.m_imBrow,100,100);
this.m_vcMachine.addElement(objBrow);
this.m_vcPC.addElement(objBrow);
DNSServItem objDNS=new DNSServItem(this,"192.168.0.3",this.m_imServ,320,80);
this.m_vcMachine.addElement(objDNS);
this.m_vcDNS.addElement(objDNS);
HTTPServItem objHTTP=new HTTPServItem(this,"192.168.0.1",this.m_imServ,480,300);
this.m_vcMachine.addElement(objHTTP);
this.m_vcHTTP.addElement(objHTTP);
objHTTP=new HTTPServItem(this,"192.168.0.2",this.m_imServ,460,120);
this.m_vcMachine.addElement(objHTTP);
this.m_vcHTTP.addElement(objHTTP);
this.m_CertItem=new CertServItem(this,"192.168.0.10",this.m_imBuil,100,300);
this.m_vcMachine.addElement(this.m_CertItem);
}
/**
* グラフィックの描画(オフスクリーンイメージからメインスクリーンへのコピー)
* @param g 描画グラフィック領域
*/
public void paint(Graphics g)
{
if(this.m_imOff==null)
{
Dimension d=this.getSize();
this.m_imOff=this.createImage(d.width,d.height);
}
this.drawAll();
g.drawImage(this.m_imOff,0,0,this);
this.m_imOff.flush();
}
/**
* グラフィックの再描画
* @param g 描画グラフィック領域
*/
public void update(Graphics g)
{
this.paint(g);
}
/**
* オフスクリーンイメージへの各グラフィックの描画
*/
private void drawAll()
{
Graphics g=this.m_imOff.getGraphics();
this.drawBack(g);
if(this.m_bStartSSL)this.drawKey(g);
this.drawPack(g);
}
/**
* 各マシンの画像、背景等の描画
* @param g 描画グラフィック領域
*/
private void drawBack(Graphics g)
{
g.setColor(new Color(57,109,165));
g.fillRect(0,0,640,480);
g.setColor(Color.black);
g.drawLine(100+this.m_imBrow.getWidth(this)/2,100+this.m_imBrow.getHeight(this)/2,310,250);
g.drawLine(320+this.m_imServ.getWidth(this)/2,80+this.m_imServ.getHeight(this)/2,310,250);
g.drawLine(480+this.m_imServ.getWidth(this)/2,300+this.m_imServ.getHeight(this)/2,310,250);
g.drawLine(460+this.m_imServ.getWidth(this)/2,120+this.m_imServ.getHeight(this)/2,310,250);
g.drawLine(100+this.m_imBuil.getWidth(this)/2,300+this.m_imBuil.getHeight(this)/2,310,250);
g.setColor(Color.white);
g.fillOval(180,200,260,100);
g.setColor(Color.black);
g.drawOval(180,200,260,100);
g.setFont(new Font("SansSerif",Font.BOLD,20));
g.drawString("インターネット",240,255);
g.setFont(new Font("SansSerif",Font.BOLD,12));
FontMetrics fontMet=g.getFontMetrics();
for(int i=0;i<this.m_vcMachine.size();i++)
{
MachineItem item=(MachineItem)this.m_vcMachine.elementAt(i);
g.drawImage(item.getImage(),item.m_nPosX,item.m_nPosY,this);
g.drawString(item.getLabel(),item.m_nPosX+(item.getImage().getWidth(this)-fontMet.stringWidth(item.getLabel()))/2,item.m_nPosY+item.getImage().getHeight(this)+fontMet.getAscent());
}
}
/**
* 鍵状態の描画
* @param g 描画グラフィック領域
*/
private void drawKey(Graphics g)
{
MachineItem client=(MachineItem)this.m_vcPC.elementAt(0);
MachineItem serv = (MachineItem)this.m_vcHTTP.elementAt(1);
g.setColor(Color.white);
g.fillRoundRect(client.m_nPosX-80,client.m_nPosY-80,100,100,10,10);
g.fillRoundRect(serv.m_nPosX+40,serv.m_nPosY-80,100,100,10,10);
g.setColor(Color.black);
g.drawRoundRect(client.m_nPosX-80,client.m_nPosY-80,100,100,10,10);
g.drawRoundRect(serv.m_nPosX+40,serv.m_nPosY-80,100,100,10,10);
if(this.m_bRecOpenKey)g.drawImage(this.m_imKey1,client.m_nPosX-60,client.m_nPosY-60,this);
g.drawImage(this.m_imKey2,client.m_nPosX-20,client.m_nPosY-60,this);
if(!this.m_bSentOpenKey)g.drawImage(this.m_imKey1,serv.m_nPosX+40+20,serv.m_nPosY-80+20,this);
if(this.m_bRecComKey)g.drawImage(this.m_imKey2,serv.m_nPosX+40+20,serv.m_nPosY-80+20,this);
g.drawImage(this.m_imKey3,serv.m_nPosX+40+60,serv.m_nPosY-80+20,this);
g.setColor(Color.black);
g.setFont(new Font("SansSerif",Font.PLAIN,12));
FontMetrics fontMet=g.getFontMetrics();
if(this.m_bRecOpenKey)g.drawString("公開鍵",(client.m_nPosX-60)+(this.m_imKey1.getWidth(this)-fontMet.stringWidth("共通鍵"))/2,client.m_nPosY+this.m_imKey1.getHeight(this)+fontMet.getHeight()-60);
g.drawString("共通鍵",(client.m_nPosX-20)+(this.m_imKey2.getWidth(this)-fontMet.stringWidth("公開鍵"))/2,client.m_nPosY+this.m_imKey2.getHeight(this)+fontMet.getHeight()-60);
if(!this.m_bSentOpenKey)g.drawString("公開鍵",(serv.m_nPosX+40+20)+(this.m_imKey1.getWidth(this)-fontMet.stringWidth("共通鍵"))/2,(serv.m_nPosY-80+20)+this.m_imKey1.getHeight(this)+fontMet.getHeight());
if(this.m_bRecComKey)g.drawString("共通鍵",(serv.m_nPosX+40+20)+(this.m_imKey2.getWidth(this)-fontMet.stringWidth("共通鍵"))/2,(serv.m_nPosY-80+20)+this.m_imKey2.getHeight(this)+fontMet.getHeight());
g.drawString("秘密鍵",(serv.m_nPosX+40+60)+(this.m_imKey3.getWidth(this)-fontMet.stringWidth("公開鍵"))/2,(serv.m_nPosY-80+20)+this.m_imKey3.getHeight(this)+fontMet.getHeight());
}
/**
* 各パケットの描画
* @param g 描画グラフィック領域
*/
private void drawPack(Graphics g)
{
Vector vcPack=this.m_vcPacket;
for(int i=0;i<vcPack.size();i++)
{
HTTPPacketData objPack=(HTTPPacketData)this.m_vcPacket.elementAt(i);
MachineItem objFrom =objPack.getMoveFrom();
MachineItem objTo =objPack.getMoveTo();
int nProcess =objPack.getProcess();
int nStatus =objPack.getStatus();
int nIconWidth =0;
int nIconHeight =0;
if(objPack.getIcon()!=null)
{
nIconWidth =objPack.getIcon().getWidth(this);
nIconHeight =objPack.getIcon().getHeight(this);
}
if(nProcess>=200)
{
this.m_vcPacket.removeElementAt(i);
objPack.setProcess(1);
objTo.postPacketAction(objPack);
continue;
}
int nPointX=0;
int nPointY=0;
if(nProcess<100)
{
nPointX=(int)((float)((310-objFrom.getImage().getWidth(this)/2-objFrom.m_nPosX)*nProcess)/100)+objFrom.m_nPosX+objFrom.getImage().getWidth(this)/2-nIconWidth/2;
nPointY=(int)((float)((250-objFrom.getImage().getHeight(this)/2-objFrom.m_nPosY)*nProcess)/100)+objFrom.m_nPosY+objFrom.getImage().getHeight(this)/2-nIconHeight/2;
}
else
{
nPointX=(int)((float)((objTo.m_nPosX+objTo.getImage().getWidth(this)/2-310)*(nProcess-100))/100)+310-nIconWidth/2;
nPointY=(int)((float)((objTo.m_nPosY+objTo.getImage().getHeight(this)/2-250)*(nProcess-100))/100)+250-nIconHeight/2;
}
g.setFont(new Font("SansSerif",Font.BOLD,12));
FontMetrics fontmet=g.getFontMetrics();
g.drawString
(
objPack.getMemo(),
nPointX,
nPointY+nIconHeight+fontmet.getHeight()
);
if(objPack.getIcon()!=null)
{
g.drawImage
(
objPack.getIcon(),
nPointX,
nPointY,
this
);
}
}
}
/**
* スレッドの開始、生成
*/
public void start()
{
if(this.m_Thread==null)
{
this.m_Thread=new Thread(this);
}
this.m_Thread.start();
}
/**
* スレッドの実行
*/
public void run()
{
while(this.m_Thread!=null)
{
this.repaint();
try
{
this.m_Thread.sleep(80);
}
catch(InterruptedException e)
{
this.m_Thread=null;
}
}
}
/**
* スレッドの停止
*/
public void stop()
{
this.m_Thread.stop();
}
/**
* マウス押下時のアクション
*/
public void mousePressed(MouseEvent evt)
{
for(int i=0;i<this.m_vcMachine.size();i++)
{
MachineItem item=(MachineItem)this.m_vcMachine.elementAt(i);
if(
evt.getX()>=item.m_nPosX
&&evt.getX()<=item.m_nPosX+item.getImage().getWidth(this)
&&evt.getY()>=item.m_nPosY
&&evt.getY()<=item.m_nPosY+item.getImage().getHeight(this)
)
{
item.onMousePressed();
}
}
}
/**
* 各種画像ファイルの読み込み
*/
private boolean loadImages()
{
MediaTracker objTrack=new MediaTracker(this);
try
{
this.m_imServ=this.getImage(this.getCodeBase(),"images/server.gif");
this.m_imBrow=this.getImage(this.getCodeBase(),"images/pc.gif");
this.m_imPacket=this.getImage(this.getCodeBase(),"images/packet.gif");
this.m_imBuil=this.getImage(this.getCodeBase(),"images/buil.gif");
this.m_imKey1=this.getImage(this.getCodeBase(),"images/key1.gif");
this.m_imKey2=this.getImage(this.getCodeBase(),"images/key2.gif");
this.m_imKey3=this.getImage(this.getCodeBase(),"images/key3.gif");
}
catch(Exception e)
{
return false;
}
objTrack.addImage(this.m_imBrow,0);
objTrack.addImage(this.m_imServ,0);
objTrack.addImage(this.m_imPacket,0);
objTrack.addImage(this.m_imBuil,0);
objTrack.addImage(this.m_imKey1,0);
objTrack.addImage(this.m_imKey2,0);
objTrack.addImage(this.m_imKey3,0);
this.m_imArray[0]=this.m_imBrow;
this.m_imArray[1]=this.m_imServ;
this.m_imArray[2]=this.m_imPacket;
this.m_imArray[3]=this.m_imBuil;
this.m_imArray[4]=this.m_imKey1;
this.m_imArray[5]=this.m_imKey2;
this.m_imArray[6]=this.m_imKey3;
try
{
objTrack.checkID(0);
objTrack.waitForAll();
}
catch(Exception e)
{
return false;
}
return true;
}
/**
* 指定画像の取り出し
* @param n 指定番号
* @return 取り出した画像
*/
public Image getImageArray(int n)
{
return this.m_imArray[n];
}
/**
* 描画するパケット列にオブジェクトを追加
* @param objPack 追加するHTTPパケットオブジェクト
*/
public void addPacket(HTTPPacketData objPack)
{
this.m_vcPacket.addElement(objPack);
}
/**
* SSLのシミュレート状態をセット
* @param b 状態フラグ
*/
public void setSSLStatus(boolean b)
{
this.m_bStartSSL=b;
if(!b)
{
this.m_bRecComKey=false;
this.m_bRecOpenKey=false;
this.m_bSentOpenKey=false;
}
}
/**
* SSLのシミュレートで公開キーの送信を通知
*/
public void sentOpenKey()
{
this.m_bSentOpenKey=true;
}
/**
* SSLのシミュレートで公開キーの受け取りを通知
*/
public void recOpenKey()
{
this.m_bRecOpenKey=true;
}
/**
* SSLのシミュレートで共通キーの受け取りを通知
*/
public void recComKey()
{
this.m_bRecComKey=true;
}
/**
* DNSサーバーオブジェクトを取得
* @return 取得したマシンオブジェクト
*/
public MachineItem getDNS()
{
return (DNSServItem)this.m_vcDNS.elementAt(0);
}
/**
* HTTPサーバーオブジェクトをIPアドレス文字列から取得
* @return 取得したマシンオブジェクト
*/
public MachineItem getHTTP(String sIP)
{
for(int i=0;i<this.m_vcHTTP.size();i++)
{
HTTPServItem item=(HTTPServItem)this.m_vcHTTP.elementAt(i);
if(item.getIP().compareTo(sIP)==0)
{
return item;
}
}
return null;
}
/**
* 認証局オブジェクトを取得
* @return 取得したマシンオブジェクト
*/
public MachineItem getCert()
{
return this.m_CertItem;
}
/**
* マウスクリック時のアクション
*/
public void mouseClicked(MouseEvent evt)
{
}
/**
* マウスが領域に入った場合のアクション
*/
public void mouseEntered(MouseEvent evt)
{
}
/**
* マウスが領域から出た場合のアクション
*/
public void mouseExited(MouseEvent evt)
{
}
/**
* マウスを離した場合のアクション
*/
public void mouseReleased(MouseEvent evt)
{
}
}