SYSTEM & SOFTWARE LAB
¿¬±¸½Ç¼Ò°³ Áöµµ±³¼ö ³í¹®/ƯÇã/º¸°í¼­ ÇÁ·ÎÁ§Æ® ¼¼¹Ì³ª °­ÀÇ½Ç °Ô½ÃÆÇ ÀÚ·á½Ç °ü·Ã»çÀÌÆ®
 

°ø°³°­ÁÂ
¸ÖƼ¹Ìµð¾îÀÀ¿ë½Ã½ºÅÛ
ÀÓº£µðµåOS
¼ÒÇÁÆ®¿þ¾î°øÇÐ
ÀÇ·áÀ¶ÇÕÀÓº£µðµå½Ã½ºÅÛ




  [Æß] JAVA RMI À» ÀÌ¿ëÇÏ¿© À̱âÁ¾ÀÇ DB¿¡ Á¢±ÙÇϱâ 2007-03-08 22:47:02  
  À̸§ : fastpopo ¹æÇѹΠ (210.115.¢½.¢½)  Á¶È¸ : 1868    
º» ÀÚ·á´Â http://www.javastudy.co.kr/ ¿¡¼­ ÆÛ¿Â±ÛÀÔ´Ï´Ù.


 ÀÌ Ãæ Çå [juncheon@orgio.net]
ÀÚ¹Ù½ºÅ͵ð ³×Æ®¿öÅ© [http://javastudy.co.kr]

 RMI (Remote Method Invocation)À» ÀÌ¿ëÇÏ¿© À̱âÁ¾ÀÇ DB¿¡ Á¢±ÙÇϱâ
RMI (Remote Method Invocation)´Â ³×Æ®¿öÅ© »ó¿¡ ¼­·Î ´Ù¸¥ °ÍÀ¸·ÎºÎÅÍ ¸Ö¸® ¶³¾îÁ® ÀÖ´Â µÎ°³ÀÇ ÀÚ¹Ù ¾ð¾î·Î Â¥¿©Áø ¾îÇø®ÄÉÀ̼ǰ£ Åë½ÅÇÏ´Â ¹æ¹ýÀÌ´Ù.

RMI´Â ¸î¸î Áß¿äÇÑ ¹üÀ§¿¡ ÀÖ´Â ¼ÒÄϰú °°ÀÌ ÇÏÀ§ ¼öÁØÀÇ Åë½Å ¹æ½Ä°ú´Â ´Ù¸¥´Ù. ÇѰ¡Áö´Â ÀÚ¿¬ÀûÀÎ ¹æ¹ýÀ¸·Î ¿ø°ÝÀ¸·Î ¸Þ¼Òµå¸¦ ÈÄÃâÇϱâ À§Çؼ­ RMI¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
Áï, ¿ø°Ý ¼­¹ö¿¡ ÀÖ´Â °´Ã¼¸¦ ÂüÁ¶ÇÒ¼ö ÀÖ°í ±× °´Ã¼ÀÇ ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. ¹°·Ð ¼ÒÄÏ ¹æ½ÄÀ¸·Î ¿ø°Ý ¸Þ¼Òµå¸¦ È£ÃâÇÒ ¼ö´Â ÀÖÁö¸¸, ÀÎÀÚ°ªÀ» ³Ñ°ÜÁشٵçÁö,
¸®ÅÏ °ªÀ» ³Ñ°ÜÁشٵçÁö µî ÀÌ·¯ÇÑ ÀÏÀ» ÇØÁÖ±â À§Çؼ­ º°µµÀÇ ¹è¿­À» ÁöÁ¤Çؾ߸¸ ÇÑ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀº ÀÚ¹Ù·Î ÇÁ·Î±×·¡¹Ö Çϱ⿡´Â ½â ÁÁÁö ¾Ê´Ù. RMI´Â ÀÌ·¯ÇÑ ¼¼ºÎÀûÀÎ °ÍµéÀ»
´Ù·ç´Â °ÍÀÌ´Ù.

¶Ç ´Ù¸¥ Â÷ÀÌÁ¡Àº RMI´Â ÀÚ¹Ù°¡ Áö¿øÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¸¸ÀÏ ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ®°¡ ÀÖÀ» °æ¿ì, RMI¸¦ ÅëÇÏ¿© Åë½ÅÇϰí, µÎ°¡Áö ¸ðµÎ ÀÚ¹Ù ÇÁ·Î±×·¥À¸·Î ±¸ÇöµÇ¾î¾ß ÇÑ´Ù.
±×¸®°í ±×°ÍÀÌ ÀÌ ÆÁ¿¡¼­ ´Ù·ç°íÀÚÇÏ´Â °ÍÁß¿¡ ÇϳªÀÌ´Ù. ÆÁ¿¡¼­´Â C¿Í C++ÇÔ¼ö¸¦ ÅëÇØ¼­ ±âÁ¸ µ¥ÀÌŸº£À̽º¸¦ Á¢±ÙÇÏ´Â RMI°¡ Áö¿øµÈ Client/Server ¾îÇø®ÄÉÀ̼ÇÀ» º¸¿©ÁØ´Ù.
¿©±â¼­ "±âÁ¸"(legacy)¶ó´Â °ÍÀº ¿¹ÀüÀÇ ¾îÇø®ÄÉÀ̼ÇÀ» ÀǹÌÇϸç, À̰ÍÀº ²À ÀڹٷΠ¥¿©Áö°Å³ª ³×Æ®¿öÅ©¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¾îµµ »ó°ü¾ø´Ù.

±×·¡¼­ À̰ÍÀÌ »ó´çÈ÷ º¹ÀâÇÑ ¾îÇø®ÄÉÀ̼ÇÀ̾, ´ÙÀ½°ú °°Àº °÷¿¡ À§Ä¡ÇÑ´Ù.
- µ¥ÀÌŸº£À̽º
- µ¥ÀÌŸº£À̽º¸¦ Á¢±ÙÇÏ´Â C ÇÔ¼ö
- ÀÚ¹Ù ¸Þ¼Òµå¸¦ ½ÇÇàÇϰí, C ÇÔ¼ö¸¦ È£ÃâÇÏ´Â C++ wrapper ÇÔ¼ö
- ¿ø°Ý °´Ã¼¸¦ »ý¼ºÇϰí RMI ·¹Áö½ºÆ®¸®¿Í ÇÔ²² µî·ÏµÇ´Â ¼­¹ö
- ·¹Áö½ºÆ®¸®¸¦ ÅëÇÏ¿© ¿ø°Ý °´Ã¼ ÂüÁ¶¸¦ ã´Â Ŭ¶óÀ̾ðÆ®. Ŭ¶óÀÌ¾ðÆ®´Â ¿ø½Ã ¸Þ¼Òµå wrapper¿Í C ÇÔ¼ö¸¦ ÅëÇØ¼­ µ¥ÀÌŸº£À̽º¿¡ Á¢±ÙÇϱâ À§ÇØ °´Ã¼¿¡ ÀÖ´Â ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.

ÀÌ ÆÁÀÇ ¼ø¼­
¾îÇø®ÄÉÀ̼ÇÀÌ »ó´çÈ÷ º¹ÀâÇϱ⠶§¹®¿¡, ÀϹÝÀûÀÎ JDC Tech ÆÁº¸´Ù ´õ ±æ´Ù. ½±°Ô ÀÌÇØÇϱâ À§Çؼ­ ÆÁÀ» ´ÙÀ½°ú °°ÀÌ ¼¼ºÎºÐÀ¸·Î ³ª´©¾ú´Ù.



Part 1. ¾îÇø®ÄÉÀÌ¼Ç ¸¸µé±â. À̺κÐÀº ¾îÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÏ´Â ºÎºÐµé·Î Á¤ÀǵȴÙ. ÀÌ·¯ÇÑ ºÎºÐµéÀÇ °¢°¢¿¡ ´ëÇÑ ¼Ò½º Äڵ尡 Á¦°øµÈ´Ù.
Part 2. ¸ðµç Á¶°¢µéÀ» ÇÕÄ¡±â. À̺κÐÀº ÀÛµ¿µÇ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â À§Çؼ­ ¸ðµç Á¶°¢µéÀ» ¾î¶»°Ô ÇÕÄ¡´Â º¸¿©ÁØ´Ù.
Part 3. ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇàÇϱâ. ¾îÇʸ®ÄÉÀ̼ÇÀ» ½ÇÇàÇϱâ À§Çؼ­ ÇÊ¿äÇÑ Á¶Ä¡µéÀ» º¸¿©ÁØ´Ù.

Part 1. ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â
RMI ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µç´Ù´Â °ÍÀº ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ°í ±× ÀÎÅÍÆäÀ̽º¸¦ ½ÇÇàÇÏ´Â °Í°ú °°Àº ÀýÂ÷¸¦ Æ÷ÇÔÇÑ´Ù. À̺κÐÀº ÀÌ·± Ưº°ÇÑ RMI ¾îÇø®ÄÉÀ̼Ç, Áï,
C¿Í C++ ÇÔ¼ö¸¦ ÅëÇØ¼­ ¿ø°Ý µ¥ÀÌŸ º£À̽º¸¦ Á¢±ÙÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¾î¶»°Ô °³¹ßÇÏ´ÂÁö¸¦ ¼³¸íÇØ ³õ¾Ò´Ù.

1. ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º Á¤ÀÇÇϱâ.

RMI ¾îÇø®ÄÉÀ̼ÇÀ» °³¹ßÇϴ ù¹øÂ° ´Ü°è´Â ¿ø°Ý¿¡ Àִ ȣÃâµÇ´Â °´Ã¼¸¦ ½ÇÇàÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¾îÇø®ÄÉÀ̼ǿ¡¼­ ÀÎÅÍÆäÀ̽º´Â
rmitest ÆÐŰÁö ¾È¿¡ ÀÖ´Â Search·Î Á¤ÀÇÇÑ´Ù.

// Search.java

package rmitest;

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

public interface Search extends Remote {
public String findEntry(String w) throws RemoteException;
}

Search ÀÎÅÍÆäÀ̽º´Â µ¥ÀÌŸº£À̽º (ÀüÈ­¹øÈ£³ª ÁÖ¼Ò¿Í °°Àº) ¾È¿¡ ÀÖ´Â ¿£Æ®¸®¸¦ ã°í, ãÀº ¿£Æ®¸® °ªÀ» ¸®ÅÏÇØÁÖ´Â findEntry ¸Þ¼Òµå Çϳª¸¦ ¼±¾ðÇϰí ÀÖ´Ù.
Áï, ¼­¹ö ¾îÇø®ÄÉÀ̼ÇÀº Search ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϴ Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ (RMI ·¹Áö½ºÆ®¿Í ÇÔ²²) µî·ÏÇÏ´Â °ÍÀÌ´Ù. ±× ´ÙÀ½¿¡ Ŭ¶óÀÌ¾ðÆ®´Â ÀνºÅϽºÀÇ ½ºÅÓÀ»
ÂüÁ¶Çϱâ À§ÇÏ¿© ·¹Áö½ºÆ®¸®¸¦ ã´Â´Ù. ½ºÅÓ¿¡ ´ëÇÑ ´õ ±íÀº ¼³¸íÀ» ÀÌ ÆÁÀÇ µÞºÎºÐ¿¡¼­ ´Ù·ê °ÍÀÌ´Ù.

¿ø°Ý Ŭ·¡½º ±â´ÉÀ» ¼³¸íÇÏ´Â ÀÎÅÍÆäÀ̽º´Â java.rmi.Remote ÀÎÅÍÆäÀ̽º¸¦ »ó¼ÓÇØ¾ß¸¸ ÇÑ´Ù. ¶ÇÇÑ, ¸Þ¼Òµå´Â java.rmi.RemoteException¶ó´Â ¿¹¿Ü󸮸¦ ÇϰԲû ¼±¾ðÇØ¾ß¸¸ ÇÑ´Ù.
RemoeExceptionÀº ³×Æ®¿öÅ© ½ÇÆÐ¿Í °°ÀÌ RMI¿¡¼­ ¹ß»ýÇÒ ¼ö Àִ Ư¼öÇÑ ¿¡·¯Å¸ÀÔÀ» ´Ù·çµµ·Ï µÇ¾îÀÖ´Ù.

2. ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â RMI ¿ø°Ý °´Ã¼ Á¤ÀÇÇϱâ.

¿ø°Ý Ŭ·¡½º¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ Á¤ÀÇµÈ ÈÄ¿¡, ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. Áï, ¿ø°Ý Ŭ·¡½º¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½ ¿¹Á¦¿¡¼­, ÀÌ Å¬·¡½º¸¦ SearchImplÀ̶ó Á¤ÀÇÇÑ´Ù.

//SearchImpl.java

package rmitest;

import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;

public class SearchImpl extends UnicastRemoteObject implements Search {
// load C/C++ shared library

static {
System.loadLibrary("rmilib");
}

//constructor

public SearchImpl() throws RemoteException {
super();
}

//public remotely-callable
//method that finds an entry

public String findEntry(String w) {
return findEntry0(w);
}

// native C++ method to actually
// look up an entry
public native static String findEntry0(String w);
}

ÀÌ Å¬·¡½º°¡ ÇÏ´Â ÀÏÀº µ¥ÀÌŸº£À̽º¸¦ °Ë»öÇÏ´Â C¿Í C++ ÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ ·ÎµùÇÏ´Â °ÍÀÌ´Ù. findEntry0¶ó´Â ¿ø½Ã ¸Þ¼Òµå·Î findEntry¸¦ È£ÃâÇÏ¿©
³Ñ±ä´Ù.

SearchImpl´Â java.rmi.server.UnicastRemoteObject Ŭ·¡½º¸¦ »ó¼ÓÇÑ´Ù. ÀÌ Å¬·¡½º´Â ¿ø°Ý °´Ã¼ ÂüÁ¶¸¦ Áö¿øÇÏ´Â °Í°ú °°Àº ±âÃÊ RMI ±â´ÉÀÇ ¸î°¡Áö¸¦ Á¦°øÇÑ´Ù.

3. µ¥ÀÌŸº£À̽º¸¦ °Ë»öÇÏ´Â CÇÔ¼ö Á¤ÀÇÇϱâ.

ÀÌ ¾îÇø®ÄÉÀ̼ÇÀÇ C ºÎºÐÀº ±âÁ¸ÀÇ µ¥ÀÌŸº£À̽ºÀÇ ¸î¸î ÇüŸ¦ Á¢±ÙÇÏ´Â ÇÔ¼öÀÌ´Ù. ÀÌ ¾îÇø®ÄÉÀ̼ǿ¡ ´ëÇØ¼­, "func"¶ó ºÒ¸®´Â ÇÔ¼ö´Â ¹®ÀÚ¿­À» ÅØ½ºÆ® ÆÄÀÏ¿¡¼­
°Ë»öÇÑ´Ù. ±×¸®°í ³ª¼­ ±× ¹®ÀÚ¿­À» Æ÷ÇÔÇÏ´Â ÆÄÀÏÀÇ Ã¹¹øÂ° ÇàÀ» ¸®ÅÏÇÑ´Ù. ÀüÈ­¹øÈ£ µð·ºÅ丮¿¡¼­ ÀÌ¿Í °°Àº ¹æ¹ýÀ¸·Î À̸§À» ã´Â ÇÔ¼ö·Î »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.
ÇÔ¼ö°¡ °Ë»öÇÏ´Â ÅØ½ºÆ® ÆÄÀÏÀÎ "data.txt"´Â ÀÏÁ¾ÀÇ µ¥ÀÌŸº£À̽ºÀÌ´Ù.

/* func.c */

#include
#include
#include

/* database */

char* db = "data.txt"

/* process input -> output */

void func(char* in, char* out) {
char inbuf[256];
int found = 0;
FILE* fp;

/* input string is empty */

if (in == NULL || !strcmp(in, "")) {
strcpy(out, "*** not found ***");
return;
}

/* open database */
fp = fopen(db, "r");
if (fp == NULL) {
strcpy(out, "*** database open error ***");
return;
}

/* search database and return */
/* first matching line                                    */

while (fgets(inbuf, sizeof inbuf, fp) != NULL) {
if (strstr(inbuf, in) != NULL) {
found = 1;
break;
}
}
fclose(fp);

/* found an entry, */
/* clip off newline    */

if (found) {
size_t len = strlen(inbuf);
if (len > = 1 && inbuf[len - 1] == '\n')
inbuf[len - 1] = 0;
strcpy(out, inbuf);
}
else {
strcpy(out, "*** not found ***");
}
}

4. C ÇÔ¼ö¿¡ ´ëÇÑ C++ ·¡ÆÛÇÔ¼ö/ÀÚ¹Ù ³×ÀÌÆ¼ºê ¸Þ¼Òµå Á¤ÀÇÇϱâ.

C ÇÔ¼ö¸¦ Á¤ÀÇÇÏ°í ³­ÈÄ¿¡, C ÇÔ¼ö¿¡ ´ëÇØ¼­ C++ ·¡ÆÛ ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. "¿Ö C ÇÔ¼ö¸¦ ¹Ù·Î ÀڹٷΠȣÃâÇÒ ¼ö ÀÖ´Â ³×ÀÌÆ¼ºê ¸Þ¼Òµå·Î »ç¿ëÇÏÁö ¾Ê´ÂÁö?" ¶ó´Â
Àǹ®ÀÌ µé °ÍÀÌ´Ù. ±× ÀÌÀ¯´Â C++ ·¡ÆÛ ÇÔ¼ö´Â C/C++ ¿¡¼­ ±¸ÇöµÈ ³×ÀÌÆ¼ºê ¸Þ¼Òµå´Â Ưº°ÇÑ À̸§À̳ª ½ÅÈ£(signature)°¡ ÇÊ¿äÇÏ´Ù. ¸¸ÀÏ ±âÁ¸ÀÇ ÇÔ¼ö³ª µ¥ÀÌŸ¸¦
Á¢±ÙÇÏ·Á ÇÑ´Ù¸é ÇöÀç ÀÖ´Â ÇÔ¼öÀÇ ±× À̸§À» º¯È¯ÇÒ ¼ö´Â ¾ø´Ù. ±×·¡¼­ ´Ù¸¥ ÇÔ¼ö°¡ ±âÁ¸ÀÇ ÇÔ¼ö¿Ü¿¡ ·¡ÆÛÇÔ¼ö·Î½á Á¤ÀǵǾî Áø´Ù.

ÇÔ¼öÀ̸§Àº ´ÙÀ½°ú °°´Ù.
Java_rmitest_SearchImpl_findEntry0

ÀÌ¿¡ ´ëÀÀÇÏ´Â ÀÚ¹Ù ³×ÀÌÆ¼ºê ¸Þ¼Òµå´Â ´ÙÀ½°ú °°´Ù.
rmitest.SearchImpl.findEntry0

¾î¶»°Ô ÀÌ ·¡ÆÛÇÔ¼ö¿¡°Ô ºÎ¿©µÇ´Â À̸§ÀÌ ¾î¶² °ÍÀÎÁö ¾î¶»°Ô ¾Æ´Â°¡? ¿©±â¼­ ´ÙÀ½°ú °°ÀÌ ·¡ÆÛÇÔ¼ö¿¡ ´ëÇÑ ¼±¾ðÀ» »ý¼ºÇØÁÖ´Â "javah"¸¦ »ç¿ëÇÑ´Ù.
javah -jni -o rmilib.cpp rmitest.SearchImpl

ÀÌ ¸í·É¾î´Â ³×ÀÌÆ¼ºê ¸Þ¼Òµå¿¡ ´ëÇÑ Java Native Interface(JNI) ¼±¾ðÀ» »ý¼ºÇÑ´Ù. ÀÌ ¾îÇø®ÄÉÀ̼ǿ¡¼­´Â javah¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù. ¿Ö³ÄÇϸé
³×ÀÌÆ¼ºê ¸Þ¼Òµå ¼±¾ð°ú ±× ±¸ÇöÀÌ ´ÙÀ½¿¡ ³ªÅ¸³­´Ù.

// rmilib.cpp

#include
#include
#include

// C function that searches database

extern "C" void func(char*, char*);

// declaration for native method
// rmitest.SearchImpl.findEntry0()

extern "C" {
JNIEXPORT jstring JNICALL
java_rmitest_SearchImpl_findEntry0
(JNIEnv *env, jclass, jstring str) {
char inbuf[256];
char outbuf[256];

// get the input string

const char* s = env->GetStringUTFChars(str, NULL);
if (s == NULL)
return NULL;

// copy it out to a char buffer

strcpy(inbuf, s);
env->ReleaseStringUTFChars(str, s);

// call C function

func(inbuf, outbuf);

// format output for return

returnenv->NewStringUTF(outbuf);
}
}

ÀÌ ·¡ÆÛÇÔ¼ö´Â ¹®ÀÚ¿­À» ÀԷ°ªÀ» ¹Þ¾Æ¼­ ±×°ÍÀ» C ŸÀÔÀÇ ¹®ÀÚ¿­(³¡ÀÚ°¡ null ÀÎ ¹ÙÀÌÆ® ¹®ÀÚ¿­)·Î º¯È¯ÇÑ´Ù. ±×´ÙÀ½¿¡ ·¡ÆÛÇÔ¼ö´Â ±âÁ¸ÀÇ C ÇÔ¼ö¸¦ È£ÃâÇϰí
ÀÚ¹Ù ÇÁ·Î±×·¥À» È£ÃâÇÏ´Â °ÍÀ» ¸®ÅÏÇϱâ À§ÇÑ ¹®ÀÚ¿­À» ¸¸µç´Ù.

µÎ°³ÀÇ C/C++ ÇÔ¼ö°¡ ÄÄÆÄÀÏ µÈ ÈÄ¿¡, °øÀ¯µÈ ¶óÀ̺귯¸® ÇüÅ·Π¹­¿©Áø´Ù. À̰ÍÀº ÀÚ¹Ù ¾îÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅÍ È£ÃâÇÒ ¼ö ÀÖ´Â ÇÔ¼ö·Î ¸¸µé¾îÁø °ÍÀÌ´Ù.

5. ¼­¹ö ÇÁ·Î±×·¥ Á¤ÀÇÇϱâ.

Áö±Ý±îÁö ¿ø°Ý ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½º, ¿ø°Ý °´Ã¼ È£Ãâ¿¡ ´ëÇÑ C¿Í C++ ÇÔ¼ö¸¦ Á¤ÀÇÇß´Ù. ±×·¯³ª ¾î¶»°Ô ¿ø°Ý °´Ã¼·Î ÇÏ¿©±Ý ¾î¶²ÀÏÀ» ÇÏ°Ô Çϴ°¡?
ù¹øÂ° ´Ü°è´Â ¿ø°Ý °´Ã¼ ÀνºÅϽº¸¦ µî·ÏÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀº ¼­¹ö¿¡ ÀÖ´Â ¿ø°Ý °´Ã¼¸¦ »ý¼ºÇؼ­ ±× °´Ã¼¿Í À̸§ÀÌ ¿¬»óµÇ´Â java.rmi.Naming.rebind¸¦ È£ÃâÇÏ´Â °ÍÀ»
ÀǹÌÇÑ´Ù. ÀÌ·¯ÇÑ ÀýÂ÷´Â À̸§-°´Ã¼ ¿¬°üÀ» ±â¾ïÇÒ ¼ö ÀÖ´Â ·¹Áö½ºÆ®¸® ÇÁ·Î±×·¥À» »ç¿ëÇÑ´Ù. ¸¸ÀÏ ÇϳªÀÇ °´Ã¼°¡ µî·ÏµÈ´Ù¸é, Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥Àº À̸§°ú ¿¬°üµÈ
java.rmi.Naming.lookupÀ» È£ÃâÇÑ´Ù. ±× ´ÙÀ½¿¡ lookupÀº ·¹Áö½ºÆ®¸®¿¡ ÀÖ´Â °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. ´õ Á¤È®È÷ ¸»Çؼ­, lookupÀº ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ stubÀ» ¹ÝȯÇÑ´Ù.
stubÀº ÀÌ ÆÁ¿¡ ³ªÁß¿¡ ³ª¿À´Â Ŭ¶óÀÌ¾ðÆ®¿¡ ´ëÇÑ ºÎºÐ¿¡¼­ ¼³¸íÇϰí ÀÖ´Ù.

JDK¿¡´Â ·¹Áö½ºÆ®¸®·Î »ç¿ëÇÏ´Â "rmiregistry"¶ó ºÒ¸®´Â ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù. RMI ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ®°¡ ½ÃÀ۵DZâ Àü¿¡ ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. rmiregistry ÇÁ·Î±×·¥Àº
RMI ¼­¹ö ÇÁ·Î±×·¥ÀÌ ÁöÁ¤ÇÑ À̸§-°´Ã¼ ¿¬°üÀ» ±â¾ïÇϰí ÀÖ´Ù. À̰ÍÀº RMI Ŭ¸®ÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ À̸§¿¡ ÀÇÇÑ ¿¬°úÀ» ã°Ô ÇØÁÖ¸ç, ¿ø°Ý °´Ã¼¿¡ ´ëÇÑ stub ÂüÁ¶¸¦
¾ò°Ô ÇØÁØ´Ù. ¿©±â¼­ ¾îÇø®ÄÉÀ̼ǿ¡ ´ëÇÑ ¼­¹ö ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°´Ù.

// Server.java

package rmitest;

import java.rmi.Naming;

public class Server {
public static void main(String args[]) {

// install RMI security manager

System.setSecurityManager(new SecurityManager());

// create a remote object and register it

try {
SearchImpl si = new SearchImpl();
Naming.rebind("searchobj", si);
}
catch (Exception e) {
System.err.println(e);
}
}
}

¼­¹ö ÇÁ·Î±×·¥¿¡¼­ ¿ø°Ý °´Ã¼¸¦ »ý¼ºÇϰí "searchobj"¶ó´Â À̸§À» »ç¿ëÇÏ¿© µî·ÏÇÏ´Â °Í¿¡ À¯ÀÇÇ϶ó. ¶ÇÇÑ º¸¾È °ü¸®ÀÚ(security manager)¸¦ ÀνºÅçÇϰí ÀÖ´Ù.
(Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥µµ ÀÌ·¯ÇÑ °ÍÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù.) º¸¾È °ü¸®ÀÚ°¡ ¾ø´Ù¸é, RMI Ŭ·¡½º ·Î´õ´Â ¿ø°Ý À§Ä¡¿¡¼­ Ŭ·¡½ºµéÀ» ´Ù¿î·ÎµåÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. º¸¾È °ü¸®ÀÚ´Â
·ÎµùµÈ Ŭ·¡½º¿¡ ÀÇÇÑ °íÀÇÀûÀÎ ¿ÀÀÛµ¿À» º¸È£ÇÑ´Ù.

6. ¼­¹ö¸¦ È£ÃâÇϴ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ Á¤ÀÇÇϱâ.

¸¶Áö¸·À¸·Î Á¤ÀÇÇÏ´Â °ÍÀº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ÀÔ·Â ¹®ÀÚ¿­À» ¹Þ¾Æ¼­ µ¥ÀÌŸº£À̽º¿¡¼­ Á¤º¸¸¦ ã±âÀ§ÇØ »ç¿ëÇÑ´Ù.
Ưº°È÷, Ŭ¶óÀÌ¾ðÆ®´Â ¼­¹ö ÇÁ·Î±×·¥ÀÌ µî·ÏÇß´ø ¿ø°Ý °´Ã¼ÀÇ findEntry ¸Þ¼Òµå¸¦ RMI È£ÃâÇÏ´Â °ÍÀ¸·Î µÇ¾î ÀÖ´Ù.

¼­¹ö ÇÁ·Î±×·¥Àº "searchobj"¶ó´Â À̸§À» »ç¿ëÇÏ¿© ¿ø°Ý °´Ã¼¸¦ µî·ÏÇÏ´Â °ÍÀ» ±â¾ïÇ϶ó. Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥Àº ¿ø°Ý °´Ã¼¸¦ ã±â À§Çؼ­ Naming.lookupÀ»
»ç¿ëÇÑ´Ù. ¶ÇÇÑ ¼­¹ö°¡ ½ÇÇàÇϰí Àִ ȣ½ºÆ® À̸§À» ³ªÅ¸³½´Ù.

//localhost/searchobj

"localhost"¶ó´Â À̸§Àº IP ÁÖ¼Ò°¡ 127.0.0.1ÀÎ ·ÎÄà ¸Ó½Å¿¡ ´ëÇÑ Æ¯º°ÇÑ À̸§ÀÌ´Ù.(ÀÌ¿¡ ´ëÇÑ ¶Ç ´Ù¸¥ À̸§À¸·Î "loopback" ÁÖ¼Ò¶ó´Â °ÍÀÌ ÀÖ´Ù.) ÀÌ ¿¹Á¦¿¡¼­,
Ŭ¶óÀÌ¾ðÆ®¿Í ¼­¹ö´Â °°Àº ±â°è¿¡¼­ ½ÇÇàµÈ´Ù. ¸¸ÀÏ ´Ù¸¥ È£½ºÆ®¿¡¼­ ¼­¹ö¸¦ ½ÇÇàÇÑ´Ù¸é, "localhost"¸¦ È£½ºÆ® À̸§À¸·Î ¹Ù²ãÁÖ¾î¾ß ÇÑ´Ù.

// Client.java

package rmitest;

import java.rmi.Naming;
import java.awt.*;
import java.awt.event.*;
import java.swing.*;

public class Client {
// do call on remote object

public static String lookup(String str) {
String t = null;
try {
String host = "//localhost/searchobj/";
Search s = (Search)Naming.lookup(host);
t = s.findEntry(str);
}
catch (Exception e) {
System.err.println(e);
}
return t;
}

public static void main(String args[]) {
JFrame frame = new JFrame("RMI Client");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

// set RMI security manager

System.setSecurityManager(new SecurityManager());

// set up input and output areas

final JTextField field = new JTextField(25);
field.requestFocus();
final JLabel label = new JLabel(" ");

// process input

field.addActionListener (new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setText(lookup(field.getText()));
}
});

// set up panels and so forth

JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
panel1.add(field);
panel2.add(label);
frame.getContentPane().add("North", panel1);
frame.getContentPane().add("South", panle2);
frame.pack();
frame.setVisible(true);
}
}

ÀÌ ÄÚµåÀÇ ÇÙ½ÉÀº ´ÙÀ½ÀÇ ¼¼ÁÙÀÌ´Ù.

String host = "//localhost/searchobj";
Search s = (Search)Naming.lookup(host);
t = s.findEntry(str);

ù¹øÂ° µÎÁÙÀº À̸§("searchobj")¿¡ ÀÇÇØ¼­ ¿ø°Ý °´Ã¼¸¦ ã´Â °ÍÀÌ´Ù. ¸¶Áö¸· ÁÙÀº ¿ø°Ý °´Ã¼ÀÇ stub¸¦ »ç¿ëÇÏ¿© µ¥ÀÌŸº£À̽º¸¦ ã´Â °ÍÀÌ´Ù.

±×·¯¸é Ŭ¶óÀÌ¾ðÆ®°¡ Á¤¸»·Î ¿ø°Ý °´Ã¼¿¡¼­ ÀÛµ¿µÇ´ÂÁö ±Ã±ÝÇÒ °ÍÀÌ´Ù. Áï, Ŭ¶óÀÌ¾ðÆ®´Â ½ÇÁ¦ ¿ø°Ý °´Ã¼¸¦ ÀÚ½ÅÀÇ ·ÎÄÿ¡ °¡Áö°í ÀÖ´Â °ÍÀ̰¡?
±× ´ë´äÀº "¾Æ´Ï´Ù"¶ó´Â °ÍÀÌ´Ù. ±×¸®°í À̰ÍÀº RMI ³»ºÎ¿¡¼­ ÀÛµ¿µÇ´Â Áß¿äÇÑ ºÎºÐÀÌ´Ù.

ÀÌ ÆÁÀÇ Part 2ÀÎ "¸ðµç Á¶°¢µéÀ» ÇÕÄ¡±â"¿¡¼­ RMI ÄÄÆÄÀÏ·¯(rmic)¶ó°í ºÎ¸£´Â °ÍÀ» ½ÇÇàÇÑ´Ù. ÀÌ µµ±¸´Â SearchImpl Ŭ·¡½º¿¡ ´ëÇÑ "stub"À» »ý¼ºÇÑ´Ù.
stubÀº ¼­¹ö¿¡ Á¸ÀçÇÏÁö¸¸, µ¿ÀûÀ¸·Î Ŭ¶óÀÌ¾ðÆ®¿¡ ´Ù¿î·Îµå µÈ´Ù. ±×·¡¼­ Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÇÇàÇÒ ¶§¿¡, stubÀ» ÅëÇØ¼­ ¿ø°Ý °´Ã¼¿Í »óÈ£ÀÛ¿ëÀ» ÇÑ´Ù.
¼­¹ö¿¡ ÀÖ´Â RMI ½Ã½ºÅÛÀ¸·Î ¸Þ¼Òµå ÀÎÀÚ°ªÀ» Æ÷¸ËÆÃÇØ¼­ Àü¼ÛÇÏ´Â °Í("Á¤µ·"(marshalling)À̶ó ºÎ¸¥´Ù.)À» ´ã´çÇÏ´Â °ÍÀÌ stubÀÌ´Ù. ¼­¹öÃø "skeleton" Ŭ·¡½º´Â
ÀÌ·¯ÇÑ Á¤º¸¸¦ ÇØ¼®ÇÏ¿©("unmarshal"À̶ó ºÎ¸¥´Ù.) ¿ø°Ý °´Ã¼¸¦ ½ÇÁ¦ÀûÀ¸·Î È£ÃâÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®·Î ¹Ýȯµð´Â °ªÀ» Àü¼ÛÇÏ´Â °ÍÀº ÀÌ·± ÀýÂ÷ÀÇ ¿ª¼øÀÌ´Ù.

ÀÌ ¿¹Á¦¿¡¼­ Ŭ¶óÀÌ¾ðÆ® ÃøÀº Client.class ¿Í Search.class ¶ó´Â À¯¿ëÇÑ Å¬·¡½º ÆÄÀÏÀ» Àڱ⠸ӽſ¡ µÎ°í ÀÖ´Ù. stub Ŭ·¡½ºÀÎ SearchImpl_Stub.class °¡ ¼­¹ö·Î ºÎÅÍÀÇ
¿ä±¸¿¡ ÀÇÇØ ´Ù¿î·Îµå µÈ´Ù. ±×·¡¼­ ¿ø°Ý °´Ã¼°¡ ¼­¹ö¿¡ ¸Ó¹«¸£°Ô µÇ°í, Ŭ¶óÀÌ¾ðÆ®´Â stub Ŭ·¡½º ÀνºÅϽº¸¦ ÅëÇØ¼­ ¿ø°Ý °´Ã¼¿Í »óÈ£ÀÛ¿ëÇÑ´Ù.

²À ¾Ë¾ÆµÎ¾î¾ß ÇÒ ´Ù¸¥ ÇѰ¡Áö´Â "codebase"¿¡ ´ëÇÑ °³³äÀÌ´Ù. À̰ÍÀº stubÀÌ ÀúÀåµÈ Àå¼ÒÀÌ´Ù. ÀÌ ¾îÇø®ÄÉÀ̼ǿ¡¼­´Â ¼­¹ö¸¦ ½ÇÇàÇÒ ¶§¿¡ codebase°¡ ÁöÁ¤µÈ´Ù.
±×°ÍÀº ´ÙÀ½°ú °°´Ù.

-Djava.rmi.server.codebase = http://localhost:2001/

Naming.rebind¸¦ »ç¿ëÇÏ¿© ¿ø°Ý °´Ã¼¸¦ µî·ÏÇÒ ¶§¿¡, °´Ã¼¿¡ ´ëÇÑ codebase°¡ ±â·ÏµÈ´Ù. °´Ã¼ÀÇ stubÀÌ ´Ù¿î·Îµå µÉ Çʿ䰡 ÀÖÀ» ¶§, codebase¸¦ ÀÌ¿ëÇÏ¿© ¹ß°ßµÉ ¼ö ÀÖ´Ù.
ÀÌ·¯ÇÑ ¾îÇø®ÄÉÀ̼ǿ¡¼­ ´Ü¼øÇÑ HTTP ¼­¹ö´Â codebase·Î ºÎÅÍ .class stubÀ» ³»¾î ³õ´Â´Ù. À̼­¹ö¿¡¼­´Â localhostÀÇ 2001 Æ÷Æ®¸¦ »ç¿ëÇÑ´Ù.

codebase´Â CLASSPATH ¼¼ÆÃ°ú ´Ù¼Ò ¿¬°üÀÌ ÀÖ´Ù. rmiregistry°¡ ÆÄÀÏÀ» ãÀ¸·Á°í ÇÒ¶§¿¡, ¸ÕÀú CLASSPATH¸¦ º¸°í³ª¼­ ´ÙÀ½¿¡ codebase¸¦ º»´Ù. ÀÌ·± Ưº°ÇÑ ¾îÇø®ÄÉÀ̼ÇÀº
¼³Á¤ÀÌ µÇ¾î À־ codebase ¼¼ÆÃÀº ÀÛµ¿ÇÏ´Â ¾îÇø®ÄÉÀ̼ǿ¡ ´ëÇØ¼­ º¸¿©Á®¾ß¸¸ ÇÑ´Ù.

¼­¹ö ÇÁ·Î±×·¥Ã³·³ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥µµ žÀçµÈ Ŭ·¡½º¿¡ ÀÇÇÑ ¿ÀÀÛµ¿À» º¸È£Çϱâ À§Çؼ­ º¸¾È °ü¸®ÀÚ¸¦ ÀνºÅçÇÑ´Ù´Â °Í¿¡ À¯ÀÇÇ϶ó.



Part 2. ¸ðµç Á¶°¢µéÀ» ÇÕÄ¡±â.

¿©±â¼­´Â ¸ÕÀú Á¤ÀÇÇß´ø ¾îÇø®ÄÉÀ̼ÇÀÇ ´Ù¾çÇÑ Á¶°¢À» °¡Áö°í ÀÛµ¿µÇ´Â ¾îÇø®ÄÉÀ̼ÇÀ¸·Î Çѵ¥ ÇÕÄ¡´Â °ÍÀ» ¼³¸íÇÑ´Ù.

1. ±âÃÊ µð·ºÅ丮 »ý¼ºÇϱâ. ÀÌÆÁÀº base ¶ó´Â À̸§À» »ç¿ëµÈ´Ù. µð·ºÅ丮´Â ½ÇÁ¦ÀûÀ¸·Î ´ÙÀ½°ú °°´Ù.

À¯´Ð½º¿¡¼­´Â
/usr/jones/rmibase
¶Ç´Â À©µµ¿ì¿¡¼­´Â
c:\rmibase

À©µµ¿ì¸¦ »ç¿ëÇÑ´Ù¸é /¸¦ ¸ðµÎ \·Î ¹Ù²ã¾ß ÇÏÁö¸¸ http:// °æ·Î´Â ±×´ë·Î µÎ¾î¾ß ÇÑ´Ù.

2. base ÇÏÀ§¿¡ µð·ºÅ丮 ±¸Á¶ »ý¼ºÇϱâ.

base/client
base/client/rmitest
base/server
base/server/rmitest
base/src
base/examples
base/examples/classServer

3. ÀÌ ÆÁÀº JDK 1.2.x¸¦ ´ÙÀ½ µð·ºÅ丮¿¡ ÀνºÅçÇÑ´Ù°í °¡Á¤ÇÑ´Ù.

/jdkbase

4. À§ÀÇ ¸ðµç ¼Ò½º ÆÄÀϵéÀ» base/src¿¡ º¹»çÇÑ´Ù.

5. base/src·Î µð·ºÅ並 ¹Ù²ã¼­, ´ÙÀ½°ú °°ÀÌ ±âÁ¸ C ÇÔ¼ö¸¦ ÄÄÆÄÀÏÇÑ´Ù.

cc -c func.c

À̰ÍÀº func.c¸¦ object ÆÄÀÏ·Î ÄÄÆÄÀÏÇÑ´Ù.(Win32¿¡¼­´Â func.obj, Solaris¿¡¼­´Â func.o)

Borland C++°ú °°ÀÌ À©µµ¿ì C/C++ ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÑ´Ù¸é, ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.

bcc32 -c -P func.c

func.c´Â C ÇÔ¼öÀÌÁö, C++ ÇÔ¼ö°¡ ¾Æ´Ï´Ù. ±×·¡¼­ C ÄÄÆÄÀÏÀ» ÇÏ´Â Àû´çÇÑ ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» »ç¿ëÇÏ¸é µÈ´Ù.

6. ´ÙÀ½°ú °°ÀÌ C++ ¿ø½Ã ÇÔ¼ö¸¦ ÄÄÆÄÀÏÇÑ´Ù.

c++ -c -l/jdkbase/include -l/jdkbase/include/win32 rmilib.cpp

¿©±â¼­ "c++"Àº ¿©·¯ºÐ ÀڽŠÄÄÇ»ÅÍ¿¡ ÀÖ´Â C++ ÄÄÆÄÀÏ·¯ÀÌ´Ù. ¸¸ÀÏ Solaris¸¦ »ç¿ëÇÑ´Ù¸é, "win32"¸¦ "solaris"·Î ¹Ù²Ù±â¸¸ ÇÏ¸é µÈ´Ù. ÀÌ °úÁ¤µµ ¿ª½Ã
object ÆÄÀÏ(rmilib.obj ³ª rmilib.o)À» ¸¸µç´Ù.

7. ´ÙÀ½°ú °°ÀÌ °øÀ¯ ¶óÀ̺귯¸¦ »ý¼ºÇÑ´Ù.

bcc32 -tWD rmilib.obj func.obj

Solaris¿¡¼­´Â ´ÙÀ½°ú °°´Ù.

cc -G -o librmilib.so rmilib.o func.o

Áï, µÎ°³ÀÇ object ÆÄÀÏÀ» ÇϳªÀÇ °øÀ¯ ¶óÀ̺귯¸®·Î ¹­´Â °ÍÀÌ´Ù.

Áö±Ý (Win32 °æ¿ì) rmilib.dll À̳ª (Solaris °æ¿ì) librmilib.so ¶óÀ̺귯¸®°¡ »ý±ä´Ù. ÀÌ ¶óÀ̺귯¸®¸¦ base/server ·Î ¿Å°Ü¶ó. System.loadLibrary ·Î ƯÁ¤È­µÈ
¶óÀ̺귯¸® À̸§°ú ½Ã½ºÅÛ »óÀÇ ½ÇÁ¦ °øÀ¯ ¶óÀ̺귯¸® À̸§ »çÀÌ¿¡ Ç÷¡Æû Á¾¼ÓÀûÀÎ ¸ÅÇÎÀÌ ÀÖ´Ù´Â °Í¿¡ À¯ÀÇÇ϶ó. ¿¹¸¦ µé¾î, "abc"¶ó´Â À̸§ÀÇ ¶óÀ̺귯¸®¸¦
·ÎµùÇÏ´Â °ÍÀº Win32¿¡¼­´Â "abc.dll"À» Solaris¿¡¼­´Â "libabc.so"·Î À̸§µÇ¾î Áø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.

ÀÌ ¾îÇø®ÄÉÀ̼ÇÀº ÇöÀç µð·ºÅ丮(".")°¡ °øÀ¯ ¶óÀ̺귯¸®¸¦ ÀÚ¹Ù ÇÁ·Î±×·¥À¸·Î ·ÎµùÇϱâ À§ÇÑ °Ë»ö °æ·Î¿¡ ÀÖ´Ù´Â °ÍÀ» °¡Á¤ÇÑ´Ù. ÀÌ·¯ÇÑ ¿µ¿ª¿¡¼­ ¹®Á¦°¡ ÀÖ´Ù¸é
"java.library.path" ¼¼ÆÃÀ» º¯È¯½ÃÄÑÁÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ¼¼ÆÃÀº ¾Æ·¡ÀÇ ¼­¹ö È£Ãâ¿¡¼­ ÀÌ·ïÁø´Ù.

8. base/server ¿¡¼­ ´ÙÀ½°ú °°Àº data.txt ¶ó´Â ÀÛÀº ÅØ½ºÆ® ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.

Jane Jones 457-9231
> Tom Garcia 143-5876
Bill Smith 456-8918

°¢ ÁÙÀÇ Çʵå´Â ½ºÆäÀ̽º·Î ºÐ¸®µÇ¾î ÀÖ´Ù. À̰ÍÀº ¾îÇø®ÄÉÀ̼ǿ¡ ÀÇÇØ °Ë»öµÉ ¼ö ÀÖ´Â ±âÁ¸ µ¥ÀÌŸº£À̽ºÀÌ´Ù.

9. base/src·Î µð·ºÅ丮¸¦ º¯È¯ÇÏ°í ´ÙÀ½°ú °°ÀÌ Ç϶ó.

javac Search.java SearchImpl.java Server.java Client.java

10. ´ÙÀ½À» º¹»çÇÑ´Ù.

Search.class SearchImpl.class Server.class

¸¦ base/server/rmitest ¿¡ º¹»çÇÑ´Ù.

11. ´ÙÀ½À» º¹»çÇÑ´Ù.

Search.class Client.class Client$1.class Client$2.class

¸¦ base/client/rmitest¿¡ º¹»çÇÑ´Ù.

12. base/server µð·ºÅ丮·Î º¯È¯Çϰí, ´ÙÀ½°ú °°ÀÌ Ç϶ó.

rmic -classpath . -d . rmitest.SearchImpl

ÀÌ ´Ü°è´Â    SearchImpl_Skel.class ¿Í SearchImpl_Stub,class¸¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù.



Part 3. ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇàÇϱâ.

¿©±â¼­´Â ¾îÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇϱâ À§ÇØ ÃëÇØÁÙ Á¶Ä¡¿¡ ´ëÇØ¼­ ¼³¸íÇÑ´Ù.

1. µ¥½ºÅ©Å¾ À©µµ¿ì¸¦ ¸¸µé°í ´ÙÀ½°ú °°ÀÌ ÇØÁØ´Ù.

rmiregistry

À§Ä¡°¡ ÀâÈù µð·ºÅ丮·ÎºÎÅÍ ÀÌ·¸°Ô Çϸé server/rmitest´Â CLASSPATH¸¦ ÅëÇØ¼­ µµ´ÞÇÒ ¼ö ¾ø°Ô µÈ´Ù. Áï, ÀÌ ¾îÇø®ÄÉÀÌ¼Ç ¼Ò½º¿Í .class ÆÄÀϰú ¿¬°üÀÌ ¾ø´Â
¾î¶°ÇÑ Àå¼Ò¿¡¼­µçÁö rmiregistry¸¦ ½ÃÀÛÇÑ´Ù. À̰ÍÀº stub ÆÄÀÏÀ» ãÀ» ¶§¿¡ CLASSPATH¿Í codebase À§Ä¡¸¦ È¥µ¿ÇÏ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇÔÀÌ´Ù.

rmiregistry ÇÁ·Î±×·¥Àº ¾Æ¹«°Íµµ È­¸é¿¡ ³ªÅ¸³»Áö ¾Ê´Â´Ù. ´ÜÁö µî·Ï ¿ä±¸¸¦ ´ë±âÇÒ »ÓÀÌ´Ù.

2. ´ÙÀ½À¸·Î ºÎÅÍ Å¬·¡½º ¼­¹ö¸¦ ´Ù¿î·Îµå ¹Þ±â.

ftp://ftp.javasoft.com/pub/jdk1.1/rmi/class-server.zip

À̰ÍÀº ÀÛÀº ºÐ·®(5K)ÀÌ´Ù. base/examples/classServer µð·ºÅ丮¿¡ ÆÄÀϵéÀ» ¾ÐÃàÀ» Ç®¾î¶ó.

3. base·Î µð·ºÅ丮¸¦ º¯°æÇÏ¿© »õ·Î¿î À©µµ¿ì¸¦ ¸¸µé°í Ŭ·¡½º ¼­¹ö¸¦ ½ÇÇàÇϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

java examples.classServer.ClassFileServer 2001 base/server

2001 Àº Ŭ·¡½º ¼­¹öÀÇ Æ÷Æ®À̰í base/server´Â ¼­¹ö°¡ .class ÆÄÀÏÀ» ã´Â Àå¼ÒÀÌ´Ù. ±×·¡¼­ ¼­¹ö°¡ base/server/rmitest/SearchImpl_Stub.class ¿Í °°ÀÌ
SearchImpl_Stub.class À» ãÀ» °ÍÀÌ´Ù.

4. base/server ·Î µð·ºÅ丮¸¦ ¹Ù²Û À©µµ¿ì¿¡¼­ RMI ¼­¹ö¸¦ ½ÇÇàÇϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

java \
-Djava.library.path = "." \
-Djava.security.policy = base/server/
java.policy.server \
-Djava.rmi.server.codebase =
http://localhost:2001/ \
rmitest.Server

java.policy.server ´Â base/server ¿¡ ÀÖ´Â policy ÆÄÀÏÀÌ´Ù. ´ÙÀ½°ú °°Àº ³»¿ëÀÌ ÀÖ´Â ÅØ½ºÆ® ÆÄÀÏÀÌ´Ù.

grant {
permission java.lang.RuntimePermission "loadLibrary.*";
permission java.util.PropertyPermission "user.dir", "read";
permission java.net.SocketPermission "*:1024-65535", "connect,accept";
};

policy ÆÄÀÏÀº ¼­¹ö¿¡ ÀνºÅçµÈ º¸¾È °ü¸®ÀÚ¿¡ ÀÇÇØ¼­ »ç¿ëµÇ´Â Çã°¡±ÇÀ» ³ªÅ¸³»°í ÀÖ´Ù.

5. base/client·Î µð·ºÅ丮¸¦ º¯°æÇÑ À©µµ¿ì¿¡¼­ Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÇÇàÇϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

java \
-Djava.security.policy =
base/client/java.policy.client \
rmitest.Client

java.policy.client ´Â base/client¿¡ ÀÖ´Â policy ÆÄÀÏÀÌ´Ù. ´ÙÀ½°ú °°Àº ³»¿ëÀ» ´ã°í ÀÖ´Â ÅØ½ºÆ® ÆÄÀÏÀÌ´Ù.

grant {
permission java.net.SocketPermission
"*:1024-65535", "connect,accept";
};



 
ÀÚµ¿µî·Ï¹æÁö : 11e96fa9fd   ¿ÞÂÊÀÇ ±ÛÀÚÁß »¡°£±ÛÀÚ¸¸ ¼ø¼­´ë·Î ÀÔ·ÂÇϼ¼¿ä.

À̸ðƼÄÜ »ç¿ë 
¸ñ·Ï ±Û¾²±â
°Ô½Ã¹° 109°Ç  
No Title Name Date Hits
119   SIMD.. (2) jinnie4u ÀÌÁÂÇü 07-07-06 3513
118   Ajax ½±°Ô »ç¿ëÇØ º¾½Ã´Ù (2) byfun ¹ÚÃѸí 07-05-03 2406
117   GCC : Intel 386 and AMD x86-64 Options byfun ÃѸíÀÌ 04-05-19 12797
116   ¸®´ª½º¿¡ Çϵåµð½ºÅ© Ãß°¡Çϱâ byfun ¹ÚÃѸí 04-02-03 2759
115   Linux Network Install (using NFS/FTP/HTTP) byfun ¹ÚÃѸí 06-03-06 3930
114   [HW] RS232 Æ÷Æ® Á¦¾î ¿¹Á¦ (3) winhoho ±èµ¿Çõ 05-03-27 21378
113   [MFC] ´ÙÀ̾ó·Î±×(Dialog)À§¿¡ Åø¹Ù(ToolBar) ºÙÀ̱â (4) jinnie4u ÀÌÁÂÇü 06-06-25 8558
112   Á¦°¡ ¾´ ±ÛÀ» ¿­¾îº¼ ¼ö°¡ ¾ø³×¿ä... ÀÌÈﺹ 07-12-09 1657
105   [Æß] XML - SAX °ú DOM API »ç¿ë fastpopo ¹æÇѹΠ07-03-08 2104
  [Æß] JAVA RMI À» ÀÌ¿ëÇÏ¿© À̱âÁ¾ÀÇ DB¿¡ Á¢±ÙÇϱâ fastpopo ¹æÇѹΠ07-03-08 1869
103   java ¿¡¼­ byte ¹è¿­ 4°³¸¦ ¸ð¾Æ¼­ int ·Î º¯È¯ ÇÒ¶§!! fastpopo ¹æÇѹΠ07-01-30 2515
102   Visual Studio Project Renamer jinnie4u ÀÌÁÂÇü 06-10-23 4464
101   Inline functions (2) ÇÑ¿ì¶÷ 06-10-09 2495
100   ½ºÇÉ ÄÁÆ®·Ñ ÀÀ¿ë(up, down) | MFC jinnie4u ÀÌÁÂÇü 06-07-19 2896
95   [ÀÓ½Ã] µðÁöÅнýºÅÛ ½ÇÇè 4ÁÖÂ÷ 5ÁÖÂ÷ ½Ç½ÀÀÚ·á dkkim ±èµ¿±¹ 06-04-03 2008

±Û¾²±â
[óÀ½][ÀÌÀü][1] 2 [3][4][5]...[´ÙÀ½][¸Ç³¡]
 
Kangwon Univ. Dept. of Computer Imformation and Communications Engineering Software and System Lab.