Server.java

  1. import java.rmi.*;

    public interface Server extends Remote{

        public void send(String msg) throws RemoteException;
        public void register(Client client, String name) throws RemoteException;   
        public void unregister(Client client, String name) throws RemoteException;   
    }

 

ServerImpl.java

  1. import java.rmi.server.*;
    import java.rmi.*;
    import java.util.*;

    public class ServerImpl extends UnicastRemoteObject implements Server {
        Vector clientList;

        public ServerImpl() throws RemoteException {
            super();
            clientList = new Vector();
        }

        public synchronized void register(Client client, String name) throws RemoteException {
            clientList.add(client);
            send(name + "님이 입장하셨습니다.");
        }

        public void send(String msg) throws RemoteException {
            synchronized(clientList) {
                Enumeration e = clientList.elements();
                while( e.hasMoreElements() ) {
                    Client c = (Client)e.nextElement();
                    c.back(msg);
                }
            }
        }

        public synchronized void unregister(Client client, String name) throws RemoteException {
            clientList.removeElement(client);
            send(name + "님이 퇴장하셨습니다.");
        }

        public static void main(String[] args) {
            try {
                ServerImpl s = new ServerImpl();
                Naming.rebind("rmi://61.103.103.184/chat", s);
                System.out.println("RMI Chat Server is ready.");
            } catch ( Exception e ) {
                e.printStackTrace();       
            }

        }
    }

 

Client.java

  1. import java.rmi.*;

    public interface Client extends Remote {
        public void back(String msg) throws RemoteException ;
    }

 

ClientImpl.java

  1. import java.awt.*;
    import java.awt.event.*;
    import java.rmi.Naming;
    import java.rmi.server.UnicastRemoteObject;

    import javax.swing.*;

    public class ClientImpl extends JFrame implements Client, ActionListener {
        JTextArea display, display2;
        JTextField input, id;
        JLabel label, nick;
        Server    server;
        JButton    register, close, enter, clear;
        String name, serverName;
        CardLayout card;
        JPanel npanel;
       
        public ClientImpl() {
            super("RMI 채팅");

            Container c = getContentPane();
            c.setLayout(new BorderLayout());

            display = new JTextArea();
            display.setEditable(false);
            JScrollPane spane = new JScrollPane(display);
            c.add(spane, "Center");

            npanel = new JPanel();
            card = new CardLayout();
            npanel.setLayout(card);

            label = new JLabel("대화명 : ");
            id = new JTextField(10);
            register = new JButton("등록");
            register.addActionListener(this);
            close = new JButton("종료");
            close.addActionListener(this);
            JPanel loginPanel = new JPanel();
           
            loginPanel.add(label);
            loginPanel.add(id);
            loginPanel.add(register);
            loginPanel.add(close);


            nick = new JLabel("즐팅!!");
            input = new JTextField(10);
            input.addActionListener(this);
            enter = new JButton("입력");
            enter.addActionListener(this);
            clear = new JButton("지우기");
            clear.addActionListener(this);
            JPanel chatPanel = new JPanel();

            chatPanel.add(nick);
            chatPanel.add(input);
            chatPanel.add(enter);
            chatPanel.add(clear);

            npanel.add(loginPanel, "login");
            npanel.add(chatPanel, "chat");
            c.add(npanel, "North");

            card.show(npanel, "login");   

            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    setVisible(false);
                    if ( server != null ) {
                        try {
                            server.unregister(ClientImpl.this, name);
                        } catch ( Exception ee ) {
                            ee.printStackTrace();
                        }
                    }
                    dispose();
                    System.exit(0);
                }
            });
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(400,500);
            setVisible(true);
        }
       
        private void connect(){
            try {
                UnicastRemoteObject.exportObject(this);
                server = (Server)Naming.lookup("rmi://61.103.103.184/chat");
                server.register(this, name);
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
       
        public synchronized void back(String msg){
            try {
                display.append(msg + "\n");
            } catch (Exception e) {
                display.append(e.toString());
            }
        }
       
        public void actionPerformed(ActionEvent e){
            Object o = e.getSource();

            if ( o == register ) {
                name = id.getText().trim();
                card.next(npanel);
                connect();
                nick.setText(name+"님, 즐팅!!");
            } else if ( o == input || o == enter ) {
                try {
                    server.send(name + " : " + input.getText());
                    input.setText("");
                } catch ( Exception ex ) {
                    display.append(ex.toString());   
                }
            } else if ( o == clear ) {
                display.setText("");
            } else if ( o == close ) {
                System.exit(0);
            }

        }
       
        public static void main(String[] args)     {
            new ClientImpl();
        }
    }

첫 실행화면

ClientImplNickInput.JPG

대화명 입력 후 화면

ClientImplNickInputAfter.JPG

다른이가 입장하였을 경우의 화면

OtherUserEnter.JPG

유저가 퇴장하였을 때 화면

OtherUserGetOut.JPG  

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts