A chat program that implements a simple two-way message with RMI, and the client can register yourself to the server. This code is originally written in the DEVELOPING JAVA Enterprise App (you can't write it yourself). A: the remote interface Interface 1: package message; import java.rmi.Remote; import java.rmi.RemoteException; / ** * coder: taie * / public interface MessageReceiver extends Remote {void print (String s) throws RemoteException;} Interface 2: package message; import java.rmi.Remote; import java.rmi.RemoteException; / ** * coder: taie * / public interface MessageServer extends Remote {static String SERVER_NAME = "Message_Server"; static int FAILURE = -1; static INT Success = 0; Void Send (String Name, String Message) throws RemoteException; int register (String name, MessageReceiver M) throws RemoteException;} JAVAC compiles the above interface. II: the server side, server-based package server; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import java.util.Enumeration Import java.util.hashtable;
import message.MessageReceiver; import message.MessageServer; / ** * coder: taie * / public class Server extends UnicastRemoteObject implements MessageServer {// a hashtable stored user static Hashtable receivers = new Hashtable (5); public Server () throws RemoteException { super ();} public void send (String name, String message) throws RemoteException {for (Enumeration e = receivers.elements (); e.hasMoreElements ();) {MessageReceiver m = (MessageReceiver) e.nextElement (); m .print (name ":" message);}} public int register (string name, messagereceiver m) {int RetVal = messageserver.failure; // Empty registration detection IF ((Name! = null) && (M! = null )) {// unique username IF (Receivers.Put (Name, M); system.out.println ("Added" name); retval = messageserver.success;} Else {System.out.Println ("Could Not Add Client Because" Name "Already exists on server.");}} Return retval;} public static void main (String [] args) {// System.setSecurityManager (new RMISecurityManager ()); try {// create an instance MessageServer srv = new Server (); // server class creates registry registry reg = LocateRegistry.createRegistry (Registry.REGISTRY_PORT); reg.rebind (MessageServer.SERVER_NAME, srv); System.out.println ( "Server bound and Started!");} Catch (Exception E) {System.err.Println ("Server Exception:"
E.GetMessage (); E.PrintStackTrace ();}}} RMIC Server.ServerServer class creates its own registry, no need to run RMIREGISTRY 3: Client, Client, mainly interface code package client; import java.aw .BorderLayout; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter ; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import message.MessageReceiver; import message. MessageServer; / ** * coder: taie * / public class Client extends Frame implements MessageReceiver, ActionListener {TextField tf; TextArea ta; static String name; static MessageServer server; public Client () throws RemoteException {setTitle (name); setLayout (new BorderLayout (); tf = new textfield (30); tf.addactionListener (this); add ("South", tf); ta = new textarea (20, 2 0); Add ("center", ta); addwindowlistener (new windowcloser ()); unicastremoteObject.exportObject (this);} public void actionPerformed (ActionEvent E) {Try {server.send (Name, Tf.getText ()) (Exception EA) {System.out.Println ("Client Exception" Ea.getMessage ()); EA.PrintStackTrace ();} tf.settext (""); tf.selectall ();} public void Print (string s) {ta.append (S "/ n");} public static void main (string [] args) {if (args.length <1) {system.out.println ("USAGE: Java Client. Client ClientName. "); System.exit (-1);
Name = args [0]; try {client cf = new client (); cf.pack (); cf.show (); server = (Messageserver) Naming.lookup (Messageserver.server_name); int s = server.register (ARGS [0], CF); IF (S == MessageServer.Failure) THROW New Exception ("COULD NOT CONNECT TO SERVER.");} Catch (Exception E) {System.err.Println ("Client Exception:" E.GETMESSAGE (); E.PrintStackTrace (); system.exit (-1);}}} Class WindowCloser Extends WINDOWADAPTER {PUBLIC VOID WINDOWCLOSISING (WindowEvent E) {system.exit (-1);}} After compiling the client, first, Java Server.server launched the server side, then execute the client (within 5, open 2) Java Client.Client Test1; Java Client.Client Test22 client normal communication This machine is commissioned.