RMI를 이용한 Chatting Source입니다.


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]

글쓴이 :이원영 1998년 11월 11일 14:15:36

In Reply to: [질문] 서버의 registry posted by 강신동 on 1998년 11월 06일 16:41:41:

예.
server.registry(this) 부분은 임의로 서버측에
Reference를 넘겨주기위한 겁니다.
(Method명이 맘에 안들죠? register()라고 적을 생각이었는데,
쩝, bind()나 login()등을 사용하면 되겠죠?)


아래는 RMI를 이용한 Chatting 프로그램입니다.
앞에서 말씀드렸다시피 이것은 Appletviwer나
HotJava 브라우져에서만 됩니다.
DNS에 등록되어 있지 않은 PC에서 RMI Applet으로의
call back interface는 안됩니다.
하지만 (아마) Client PC가 DNS에 등록되어 있다면 될 겁니다.
전부 5개의 파일입니다.


1. Files
ChatServer.java, ChatServerImpl.java, Server.java,
ChatClient.java, ChatClientImplApplet.java


2. 실행절차
(1) 모두 Web Server가 있는 머신에 5개의 파일을 copy
(HotJava를 사용하지 않고 appletviewer로만 하려면 아무데서나...)


(2) ChatClientImplApplet.java에서 서버 lookup할 때
IP Address부분 고침.(컴파일하면 error로 걸림)
(3) javac *.java
(4) rmic ChatServerImpl
(5) rmic ChatClientImplApplet
(6) java Server& (RMI Chat Server를 실행)
----------------
(7) 적당히 code=ChatClientImplApplet width=400, height=300으로 ChatApplet.html파일을
만듬.
(8) PC의 HotJava 브라우져에서 위에서 만든 ChatApplet.html을 웹서버를 통해
읽어 봄.
(9) 혹은 Appletviewer로 하려면, 위의 모든 컴파일된
파일을 PC로 가져와서 appletviwer ChatApplet.html로
Client를 실행. (여러개의 appletviewer로 보면 대화가 가능함)
물론 이렇게 하려면 rmi://165.233.225.233:8943/ChatServer와 같이
RMI서버의 위치를 ChatClientImplApplet.java에서 명시해 주어야 함.



==================================================
[ChatServer.java]
public interface ChatServer extends java.rmi.Remote
{
boolean login(ChatClient client) throws java.rmi.RemoteException;
void logout(ChatClient client) throws java.rmi.RemoteException;
boolean send(String message) throws java.rmi.RemoteException;
}


==================================================
[ChatServerImpl.java]
import java.rmi.server.*;
import java.rmi.*;
import java.util.*;


public class ChatServerImpl extends java.rmi.server.UnicastRemoteObject implements ChatServer
{
private Vector clients = null;
ChatServerImpl() throws java.rmi.RemoteException
{
super();
clients = new Vector();
}

public boolean login(ChatClient client) throws java.rmi.RemoteException
{
clients.addElement(client);
this.send("*** " + client.getName() + " 님이 들어오셨습니다. ***");
return true;
}
public void logout(ChatClient client) throws java.rmi.RemoteException
{
String name = client.getName();
clients.removeElement(client);
this.send("*** " + name + " 님이 나가셨습니다. ***");
}

public boolean send(String message) throws java.rmi.RemoteException
{
Vector clientsCopy = (Vector)clients.clone();
Enumeration e = clientsCopy.elements();
while(e.hasMoreElements()){
ChatClient client = (ChatClient)e.nextElement();
try {
client.update(message);
}
catch(RemoteException ex){
this.logout(client);
}
}
return true;
}
}


==================================================
[Server.java]
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
import java.util.*;


public class Server
{
static final int PORT = 8943;
static final String SERVER_NAME = "ChatServer";

public static void main(String argv[])
{
try{
InetAddress address = InetAddress.getLocalHost();
String thisHost = address.getHostAddress();


Properties currentProperties = System.getProperties();
currentProperties.put("java.rmi.server.hostname", thisHost);
System.setProperties(currentProperties);


System.setSecurityManager (new RMISecurityManager());
System.out.print("\nServer.main: creating registry...");
LocateRegistry.createRegistry(PORT);
System.out.println("OK.");

System.out.print("Server.main: creating " + SERVER_NAME + "...");
ChatServer server = new ChatServerImpl();
System.out.println("OK.");


System.out.print("Server.main: binding " + SERVER_NAME + "...");
Naming.rebind("//:" + PORT + "/" + SERVER_NAME , server);
System.out.println("OK.\n");


System.out.println(SERVER_NAME + " ready to continue.");
}
catch (Exception e){
System.out.println("Server.main: An Exceptin occured :" +
e.getMessage());
e.printStackTrace();
}
}
}


==================================================
[ChatClient.java]
public interface ChatClient extends java.rmi.Remote
{
void update(String message) throws java.rmi.RemoteException;
String getName() throws java.rmi.RemoteException;
}


==================================================
[ChatClientImpl.java]
import java.awt.*;
import java.applet.*;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;


import com.sun.java.swing.*;
public class ChatClientImplApplet extends Applet implements ChatClient
{
static final int PORT = 8943;
static final String SERVER_NAME = "ChatServer";
ChatServer server = null;


public void init()
{
setLayout(new CardLayout(0,0));
setSize(456,308);
loginPanel = new java.awt.Panel();
loginPanel.setLayout(null);
loginPanel.setBounds(0,0,456,308);
loginPanel.setBackground(new Color(12632256));
add("loginCard", loginPanel);
loginTextField = new java.awt.TextField();
loginTextField.setBounds(192,120,122,21);
loginPanel.add(loginTextField);
loginButton = new java.awt.Button();
loginButton.setLabel("Login");
loginButton.setBounds(144,156,171,29);
loginButton.setBackground(new Color(12632256));
loginPanel.add(loginButton);
label = new java.awt.Label("이 름");
label.setBounds(144,120,48,21);
loginPanel.add(label);
titleLabel = new java.awt.Label("Welcome to Chattin Applet",Label.CENTER);
titleLabel.setBounds(72,36,321,36);
titleLabel.setFont(new Font("Dialog", Font.PLAIN, 16));
titleLabel.setForeground(new Color(255));
titleLabel.setBackground(new Color(16776960));
loginPanel.add(titleLabel);
chatPanel = new java.awt.Panel();
chatPanel.setLayout(new BorderLayout(0,0));
chatPanel.setBounds(0,0,456,308);
add("chatCard", chatPanel);
textArea = new java.awt.TextArea();
textArea.setEditable(false);
textArea.setBounds(0,0,456,308);
chatPanel.add("Center", textArea);
messagePanel = new java.awt.Panel();
messagePanel.setLayout(new BorderLayout(0,0));
messagePanel.setBounds(0,285,456,0);
chatPanel.add("South", messagePanel);
nameTextField = new java.awt.TextField();
nameTextField.setText(" ");
nameTextField.setBounds(0,0,81,23);
messagePanel.add("West", nameTextField);
messageTextField = new java.awt.TextField();
messageTextField.setBounds(81,0,375,23);
messagePanel.add("Center", messageTextField);
logoutButton = new java.awt.Button();
logoutButton.setLabel("LogOut");
logoutButton.setBounds(402,0,54,23);
logoutButton.setBackground(new Color(12632256));
messagePanel.add("East", logoutButton);
((CardLayout) getLayout()).show(this,"loginCard");
try {
UnicastRemoteObject.exportObject(this); // <-- export to Remote Object !!
server = null;
}
catch(Exception e){
textArea.append(e.getMessage());
}

SymAction lSymAction = new SymAction();
messageTextField.addActionListener(lSymAction);
loginButton.addActionListener(lSymAction);
logoutButton.addActionListener(lSymAction);
}


public void destroy(){
try{
server.logout(this);
}
catch(Exception e){}
server = null;
}

java.awt.Panel loginPanel;
java.awt.TextField loginTextField;
java.awt.Button loginButton;
java.awt.Label label;
java.awt.Label titleLabel;
java.awt.Panel chatPanel;
java.awt.TextArea textArea;
java.awt.Panel messagePanel;
java.awt.TextField nameTextField;
java.awt.TextField messageTextField;
java.awt.Button logoutButton;

public String getName()
{
return nameTextField.getText().trim();
}

public void update(String message)
{
textArea.append(message + "\n");
}


class SymAction implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent event)
{
Object object = event.getSource();
if (object == messageTextField)
messageTextField_EnterHit(event);
else if (object == loginButton)
loginButton_ActionPerformed(event);
else if (object == logoutButton)
logoutButton_ActionPerformed(event);
}
}


void messageTextField_EnterHit(java.awt.event.ActionEvent event)
{
if ( server == null ) return;
try {
server.send( nameTextField.getText().trim() + " : " + messageTextField.getText() );
messageTextField.setText("");
}
catch(RemoteException e){
textArea.append(e.getMessage());
}
}


void loginButton_ActionPerformed(java.awt.event.ActionEvent event)
{
nameTextField.setText(loginTextField.getText());
textArea.setText("");
messageTextField.setText("");
try {
java.awt.CardLayout cardLayout = (java.awt.CardLayout)getLayout();
cardLayout.show(this,"chatCard");
server = (ChatServer) Naming.lookup(
// "rmi://"+getCodeBase().getHost() + ":" + PORT + "/" + SERVER_NAME);
!!고치세요!! "rmi://165.244.227.233:" + PORT + "/" + SERVER_NAME);
server.login(this);
}
catch(Exception e){
textArea.append(e.getMessage());
}
}


void logoutButton_ActionPerformed(java.awt.event.ActionEvent event)
{
try
{
java.awt.CardLayout cardLayout = (java.awt.CardLayout)getLayout();
cardLayout.show(this,"loginCard");
server.logout(this);
}
catch(Exception e){}
server = null;
}
}
=========<end>===============


다음 글들:



이어서 글올리기(답하기)

이름:
E-Mail:
제목:
내용:
HTML 태그 포함 여부: HTML 문서일 경우 체크
관련 URL(선택):
URL 제목(선택):
관련 이미지 URL:


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]