そのうち説明書くから許して・・・(汗)
build.xml classes public_html src classes: bbs classes/bbs: BBS.class BBSApplet.class BBSImpl_Stub.class Message.class BBSApplet$1.class BBSImpl.class BBSServer.class BBSApplet$2.class BBSImpl_Skel.class BBSStore.class public_html: bbs index.html public_html/bbs: BBS.class BBSApplet$2.class BBSImpl_Stub.class BBSApplet$1.class BBSApplet.class Message.class src: bbs src/bbs: BBS.java BBSImpl.java BBSStore.java BBSApplet.java BBSServer.java Message.java
package bbs; import java.util.List; import java.rmi.Remote; import java.rmi.RemoteException; /** * BBS のリモートインターフェイス。 */ public interface BBS extends Remote { /** * BBS にメッセージを登録する。 * @param message メッセージ */ public void addMessage(Message message) throws RemoteException; /** * BBS からメッセージ一覧を取得する。 * @return メッセージ一覧 */ public List getMessages() throws RemoteException; }
package bbs; import java.util.List; import java.util.Date; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class BBSImpl extends UnicastRemoteObject implements BBS { public BBSImpl() throws RemoteException { } /** * BBS にメッセージを登録する。 * @param message メッセージ */ public void addMessage(Message message) { message.setTime(new Date()); BBSStore.getInstance().addMessage(message); } /** * BBS からメッセージ一覧を取得する。 * @return メッセージ一覧 */ public List getMessages() { return BBSStore.getInstance().getMessages(); } }
package bbs; import java.util.List; import java.util.ArrayList; public class BBSStore { /** 保存するメッセージ数 */ public static final int SIZE = 20; /** シングルトンインスタンス */ private static BBSStore instance = new BBSStore(); /** メッセージの保存先 */ private List messages = new ArrayList(); /** * BBSStoreのインスタンスを取得する。 * @return BBSStore */ public static BBSStore getInstance() { return instance; } private BBSStore() { } /** * BBS にメッセージを登録する。 * @param message メッセージ */ public synchronized void addMessage(Message message) { // ここではメモリに置くだけ。再起動しても保存したければ、 // ファイルに書いても良い。 messages.add(message); if (messages.size() > SIZE) { messages.remove(0); } } /** * BBS からメッセージ一覧を取得する。 * @return メッセージ一覧 */ public List getMessages() { return messages; } }
package bbs; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class BBSServer { public static void main(String args[]) throws Exception { LocateRegistry.createRegistry(1099); BBSImpl bbs = new BBSImpl(); Naming.rebind("BBS", bbs); } }
package bbs; import java.io.Serializable; import java.util.Date; public class Message implements Serializable { /** 発言者 */ private String name; /** 時刻 */ private Date time; /** メッセージ */ private String text; /** * 発言者を設定する。 * @param name 発言者 */ public void setName(String name) { this.name = name; } /** * 発言者を取得する。 * @return 発言者 */ public String getName() { return name; } /** * 時刻を設定する。 * @param time 時刻 */ public void setTime(Date time) { this.time = time; } /** * 時刻を取得する。 * @return 時刻 */ public Date getTime() { return time; } /** * メッセージを設定する。 * @param text メッセージ */ public void setText(String text) { this.text = text; } /** * メッセージを取得する。 * @return メッセージ */ public String getText() { return text; } }
package bbs; import java.util.List; import java.util.Iterator; import java.rmi.Naming; import java.awt.Container; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JApplet; import javax.swing.BoxLayout; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JScrollPane; public class BBSApplet extends JApplet { JTextArea bbsArea = new JTextArea(40, 40); JTextField nameArea = new JTextField(30); JTextArea inputArea = new JTextArea(10, 40); BBS bbs; public void init() { Container pane = getContentPane(); pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); pane.add(new JScrollPane(bbsArea)); JButton updateButton = new JButton("更新"); updateButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateBBS(); } }); pane.add(updateButton); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel("名前:")); p.add(nameArea); pane.add(p); pane.add(new JScrollPane(inputArea)); JButton inputButton = new JButton("書き込み"); inputButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { writeBBS(); } }); pane.add(inputButton); try { bbs = (BBS) Naming.lookup("//" + getCodeBase().getHost() + "/BBS"); } catch (Exception e) { e.printStackTrace(); bbsArea.append(e.toString()); } updateBBS(); } public void updateBBS() { if (bbs == null) { return; } List messages; try { messages = bbs.getMessages(); } catch (Exception e) { e.printStackTrace(); bbsArea.append(e.toString()); return; } bbsArea.setText(""); for (Iterator i = messages.iterator(); i.hasNext(); ) { Message m = (Message) i.next(); bbsArea.append(m.getName() + ": " + m.getTime() + "\n"); bbsArea.append(m.getText()); bbsArea.append("\n----------\n"); } } public void writeBBS() { if (bbs == null) { return; } Message m = new Message(); m.setName(nameArea.getText()); m.setText(inputArea.getText()); inputArea.setText(""); try { bbs.addMessage(m); } catch (Exception e) { e.printStackTrace(); bbsArea.append(e.toString()); } updateBBS(); } }
<project name="bbs" default="compile" basedir="."> <!-- set global properties for this build --> <property name="src" value="src"/> <property name="build" value="classes"/> <property name="apidoc" value="docs"/> <path id="project.class.path"> <pathelement path="${build}/"/> <pathelement path="${java.class.path}/"/> </path> <target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> <mkdir dir="${apidoc}"/> </target> <target name="compile" depends="init"> <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}" encoding="Shift_JIS" depend="yes" deprecation="on"> <classpath refid="project.class.path"/> </javac> <rmic classname="bbs.BBSImpl" base="${build}"/> </target> <target name="copy" depends="compile"> <copy todir="public_html/"> <fileset dir="${build}"> <include name="bbs/BBSApplet*.class"/> <include name="bbs/*_Stub.class"/> <include name="bbs/Message.class"/> <include name="bbs/BBS.class"/> </fileset> </copy> </target> <target name="doc" depends="init"> <!-- Compile the java code from ${src} into ${build} --> <javadoc sourcepath="${src}" destdir="${apidoc}" Encoding="Shift_JIS" packagenames="bbs.*"> <classpath refid="project.class.path"/> </javadoc> </target> <target name="clean"> <!-- Delete the ${build} and ${dist} directory trees --> <delete dir="${build}"/> <delete dir="${dist}"/> </target> </project>
java -Djava.rmi.server.hostname=www.wizard-limit.net bbs.BBSServer