RMI

ProudNet은 자체 개발된 Remote Method Invocation(RMI) μ‹œμŠ€ν…œμœΌλ‘œ, 기쑴에 ν†΅μš©λ˜λŠ” IDL ν˜•μ‹μ΄λ‚˜ RMI μ‹œμŠ€ν…œλ³΄λ‹€ 훨씬 λΉ λ₯΄κ³  κ°€λ²Όμš°λ©° κ²Œμž„ κ°œλ°œμ—μ„œλŠ” 'ν•¨μˆ˜ 호좜 리턴값'을 비동기 RMI만 μ§€μ›ν•©λ‹ˆλ‹€.

RMI ν•¨μˆ˜ κ·Έλ£Ή

0개 μ΄μƒμ˜ RMI ν•¨μˆ˜ μ§‘ν•©μœΌλ‘œ, PIDL νŒŒμΌμ—μ„œλŠ” global ꡬ문 λΈ”λŸ­μ˜ ν˜•νƒœμž…λ‹ˆλ‹€.

global SimpleC2S
{
    ...;
}

Proxyμ—μ„œ RMI ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ¦‰μ‹œ λ¦¬ν„΄ν•©λ‹ˆλ‹€. 그리고 RMI ν•¨μˆ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό Proxy μΈ‘μ—μ„œ κΈ°λ‹€λ Έλ‹€κ°€ λ°›μ§€λŠ” λͺ»ν•©λ‹ˆλ‹€.

RMI λ©”μ„œλ“œ 인자 속성

λ©”μ„œλ“œ μΈμžμ—λŠ” 속성 μ •μ˜κ°€ λ“€μ–΄κ°€λ©° 각 νŒŒλΌλ―Έν„°λ§ˆλ‹€ ν•œ 개 이상 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

circle-info

in : μž…λ ₯ ν˜•μ‹μ˜ μΈμžμž„μ„ μ˜λ―Έν•˜λ©° λ°˜λ“œμ‹œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν˜„μž¬ λ²„μ „μ—μ„œλŠ” 'out'을 μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

// 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 RMI λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λ©΄ 
Test([in] Proud::String a,[in] int b,[in] float c);

// λ‹€μŒκ³Ό 같은 C++ codeκ°€ μƒμ„±λ©λ‹ˆλ‹€.
Test(Proud::HostID remote, Proud::RmiContext& rmiContext, const Proud::String& a, const int& b, const float& c);

λŒ€λΆ€λΆ„μ˜ 경우 RMI λ©”μ„œλ“œμ˜ 인자의 속성은 in λ§Œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

- byval 속성

μΈμžκ°€ by value둜 전달됨을 μ˜λ―Έν•˜λ©° 이것이 μ‚¬μš©λ˜λ©΄ C++ proxy 및 stubμ—μ„œ 인자 ν˜•μ‹μ— & λΆ€ν˜Έκ°€ μƒλž΅λ©λ‹ˆλ‹€. intλ‚˜ float λ“± 인자 ν˜•μ‹μ— 크기가 μž‘μ€ ν˜•μ‹μ— μ ν•©ν•©λ‹ˆλ‹€.

- mutable 속성

μΈμžκ°€ const type이 μ•„λ‹˜μ„ μ˜λ―Έν•˜λ©° 이것이 μ‚¬μš©λ˜λ©΄ C++ proxy 및 stubμ—μ„œ 인자 ν˜•μ‹μ— const ν‚€μ›Œλ“œκ°€ μƒλž΅λ©λ‹ˆλ‹€. RMI stubμ—μ„œ 받은 인자의 값을 λ³€κ²½ν•˜κ³ μž ν•  λ•Œ μ ν•©ν•©λ‹ˆλ‹€.

이쒅 μ–Έμ–΄λ‘œ 된 ν”„λ‘œκ·Έλž¨ κ°„ ν†΅μ‹ ν•˜κΈ°

두 ν”„λ‘œκ·Έλž¨μ΄ ProudNet으둜 ν†΅μ‹ ν•˜λ˜ μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ λ§Œλ“€κ³  싢을 λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 PIDL μ»΄νŒŒμΌλŸ¬λŠ” 두 개 μ΄μƒμ˜ μ–Έμ–΄λ‘œ 된 proxy와 stub을 μƒμ„±ν•œ ν›„ 각 ν”„λ‘œκ·Έλž¨μ€ ν•„μš”ν•œ 것을 κ°€μ Έλ‹€ μ“°λ©΄ λ©λ‹ˆλ‹€.

int, double, string λ“± κΈ°λ³Έ νƒ€μž…μ— λŒ€ν•΄μ„œλŠ” ProudNet의 C++ μ™Έμ˜ μ–Έμ–΄λ₯Ό μœ„ν•œ λž˜ν•‘ λͺ¨λ“ˆμ—μ„œ 이미 μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ–Έμ–΄κ°€ μ„œλ‘œ λ‹€λ₯΄λ©΄ μ΄λŸ¬ν•œ κΈ°λ³Έ νƒ€μž…μ˜ 이름이 기본적으둜 달라지기 λ§ˆλ ¨μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ C# 은 λ¬Έμžμ—΄ ν΄λž˜μŠ€κ°€ System.String 인데, C++μ—μ„œλŠ” std::string, std::wstring, ATL::CString, Proud::Stringμž…λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ PIDL μ»΄νŒŒμΌλŸ¬λŠ” μ‚¬μš©μžκ°€ 원할 경우 μƒμ„±λ˜λŠ” proxy, stubμ—μ„œ λ³€μˆ˜ νƒ€μž…μ„ νŠΉμ • 언어에 ν•œν•΄μ„œ λ³€κ²½ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” μ‚¬μš© μ˜ˆμž…λ‹ˆλ‹€.

RMI λ©”μ‹œμ§€ λ²”μœ„

각 RMI ν•¨μˆ˜ 선언은 1개의 λ©”μ‹œμ§€ νƒ€μž…μ„ κ°€μ§‘λ‹ˆλ‹€. ProudNet의 λ©”μ‹œμ§€ νƒ€μž…μ€ 6만 μ΄ν•˜μ˜ λ²”μœ„μ—μ„œ μ‚¬μš©μžκ°€ κ²°μ •ν•˜λ©° 이 λ²”μœ„λŠ” μ‚¬μš©μžκ°€ .pidl νŒŒμΌμ„ μž‘μ„±μ‹œμ— ν•©λ‹ˆλ‹€.

1.7.42965-master 미만의 λ²„μ „μ—μ„œλŠ” 1,300 ~ 60,000 λ²”μœ„μ˜ 값을 μ‚¬μš©ν•˜μ…”μ•Ό λ©λ‹ˆλ‹€.

각 RMI의 λ©”μ‹œμ§€ νƒ€μž… κ°’μ˜ μ˜ˆλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

각각의 ν•¨μˆ˜λŠ” λ©”μ‹œμ§€ νƒ€μž… 값이 ν•˜λ‚˜μ”© μ¦κ°€ν•©λ‹ˆλ‹€. 그리고 λ§ˆμ§€λ§‰μœΌλ‘œ μ„ μ–Έλœ RMI ν•¨μˆ˜μ— λ°°μ •λœ νƒ€μž… κ°’κΉŒμ§€λ₯Ό λ©”μ‹œμ§€ λ²”μœ„λΌκ³  μΉ­ν•˜κ² μŠ΅λ‹ˆλ‹€. μœ„μ˜ μ˜ˆμ‹œμ—μ„œ 2,000 ~ 2,003이 SampleRMIλ₯Ό μœ„ν•œ λ©”μ‹œμ§€ λ²”μœ„μž…λ‹ˆλ‹€.

μƒμ„±λœ Proxy와 Stub을 Proud.CNetClient , Proud.CNetServer , Proud.CLanClient , Proud.CLanServer 에 attach ν•˜λ©΄ 각 RMI function group λ“€μ˜ λ©”μ‹œμ§€ λ²”μœ„κ°€ Proud.CNetClient , Proud.CNetServer , Proud.CLanClient , Proud.CLanServer 에 μ˜ˆμ•½λ©λ‹ˆλ‹€.

λ§Œμ•½ attach ν•  proxy와 stubλ“€μ˜ λ©”μ‹œμ§€ λ²”μœ„κ°€ κ²ΉμΉ˜λŠ” 것듀이 있으면 AttachProxy() λ‚˜ AttachStub() 은 exception을 λ°œμƒμ‹œν‚¬ κ²ƒμž…λ‹ˆλ‹€.

circle-info

C#μ—μ„œ CNetClient -> NetClient

C#μ—μ„œ CNetServer -> NetServer


ν™œμš©

RMI ν™œμš©λ²•chevron-right

Last updated

Was this helpful?