客户端接口:

package com.kkoolerter.service;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IChatClient extends Remote {

    public String getUserName()throws RemoteException;
    public void sendMessage(String msg)throws RemoteException;
}

远程接口:

package com.kkoolerter.service;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IChatService extends Remote{
    public void addClient(IChatClient client,String msg)throws RemoteException;
    public void removeClient(IChatClient client,String msg)throws RemoteException;
    public void sendMessage(IChatClient clientm,String msg)throws RemoteException;
}

package com.kkoolerter.service;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import javax.swing.JFrame;

public class ChatClient extends JFrame implements IChatClient, ActionListener {

    private static final long serialVersionUID = 2950857379461851268L;
    private String title;
    private String user;
    private IChatService chatService;
    private TextField serverName;
    private TextField serverPort;
    private TextField userName;
    private TextField message;
    private Button send;
    private TextArea fromServer;
    private boolean connected = false;
    private Button connect;
    private Button disconnect;

    public ChatClient(String str) {
        super(str);
        System.setSecurityManager(new RMISecurityManager());
        setBounds(50, 20, 350, 400);
        setLayout(new FlowLayout(FlowLayout.CENTER, 25, 10));
        title = str;
        setStatus();

        add(new Label("Chat Server:"));
        serverName = new TextField(20);
        serverName.setText("localhost");
        serverName.setEnabled(false);
        add(serverName);

        add(new Label("Server Port:"));
        serverPort = new TextField(20);
        serverPort.setText("1099");
        serverPort.setEnabled(false);
        add(serverPort);

        add(new Label("User Name:"));
        userName = new TextField(20);
        userName.setText("");
        add(userName);

        connect = new Button("Connect");
        connect.addActionListener(this);
        add(connect);

        disconnect = new Button("Disconnect");
        disconnect.addActionListener(this);
        add(disconnect);

        message = new TextField(30);
        add(message);

        send = new Button("Send");
        send.addActionListener(this);
        add(send);

        fromServer = new TextArea(10, 40);
        add(fromServer);

        try {
            UnicastRemoteObject.exportObject(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        setVisible(true);
    }

    private void connect() {
        try {
            chatService = (IChatService) Naming
                    .lookup("rmi://localhost:1099/IChatService");
            connected = true;
            setStatus();
            user = userName.getText().trim();
            chatService.addClient(this, user + "上线");
        } catch (Exception e) {
            fromServer.append("error connection.\n");
            e.printStackTrace();
            connected = false;
            setStatus();
            chatService = null;

        }
    }

    private void disconnect() {
        try {
            if (chatService == null) {
                return;
            }
            chatService.removeClient(this, user + "下线");
            chatService = null;
        } catch (Exception e) {
            fromServer.append("error disconnection.\n");
        } finally {
            connected = false;
            setStatus();
        }
    }

    private void setStatus() {
        if (connected) {
            setTitle(title + " connected");
        } else {
            setTitle(title + " disconnected");
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == connect) {
            if (chatService == null) {
                connect();
                if (connected) {
                    userName.setEnabled(false);
                    connect.setEnabled(false);
                }
            }
        } else if (e.getSource() == disconnect) {
            disconnect();
            serverName.setEnabled(true);
            serverPort.setEnabled(true);
            userName.setEnabled(true);
            connect.setEnabled(true);
        } else if (e.getSource() == send) {
            if (chatService == null) {
                return;
            }
            try {
                chatService.sendMessage(this, message.getText());
                message.setText("");
            } catch (Exception e2) {
                fromServer.append("error sending message.\n");
                e2.printStackTrace();
            }
        }
    }

    @Override
    public void sendMessage(String msg) throws RemoteException {
      fromServer.append(msg+"\n");
    }

    @Override
    public String getUserName() throws RemoteException {
        return user;
    }

    public static void main(String[] args) {
        new ChatClient("hello");
    }
}