锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鎴愬憳_reserverd鏄竴涓瓧絎︿覆闆嗗悎錛屽畠瀛樺偍宸茬粡寤虹珛鍥炶瘽錛屼絾鏄繕娌℃湁鍔犲叆鑱婂ぉ瀹ょ殑瀹㈡埛鍚嶃俖members瀛樺偍褰撳墠鑱婂ぉ瀹ょ殑鎵鏈夌敤鎴鳳紙宸茬粡璋冪敤榪噅oin鍑芥暟鐨勭敤鎴鳳級銆?br> 綾?ChatRoomCallbackAdapter 娉ㄦ剰錛屽湪浣跨敤join浼犻掍唬鐞嗕箣鍓嶏紝鍚戝鎴蜂唬鐞嗘坊鍔犱簡涓涓間負 "o" 鐨刜fwd涓婁笅鏂囥傚畠鎻愮ずGlacier浣跨敤鍗曞悜璋冪敤鏉ヨ漿鍙戝鎴峰洖璋冦傝繖鏍鋒瘮鍙屽悜璋冪敤鏇村姞鏈夋晥銆傚洜涓烘墍鏈夌殑鍥炶皟鎿嶄綔鍧囦負void榪斿洖鍊鹼紝鎵浠ュ彲浠ュ崟鍚戣皟鐢ㄣ?br> 鏈嶅姟鍣ㄧ殑鍥炶皟涓烘櫘閫氱殑鍙屽悜璋冪敤銆傝繖鏍峰綋鍑洪敊鏃跺彲浠ラ氱煡鏈嶅姟鍣ㄣ傚綋瀹㈡埛绔嚭閿欐椂錛岃繖涓緇撴潫瀹㈡埛浼氳瘽寰堟湁鐢ㄣ?br>
Go璇█鏄疓oogle鎺ㄥ嚭鐨勬柊鐨勪竴涓嚧鍔涗簬緋葷粺綰х殑緙栫▼璇█銆傚緢澶氫漢璇村畠鏄?C + Python錛屾棦鏈塩鐨勭伒媧婚珮鏁堬紝鍙堟湁Python鐨勭畝鍗曟槗鐢紝瀹冪殑鍘熷垯鏄?Simple && Fast銆傚畠鐨勮娉曡鍒欏緢綆鍗曘傚叾瀹樻柟緗戠珯涓婃湁涓涓婁笁澶╁浼欸o璇█銆嬬殑鏁欑▼錛屽寘鎷笁閮ㄥ垎錛氬熀鏈粨鏋勶紝闈㈠悜瀵硅薄錛屽茍鍙戙備竴涓懆鏈殑鏃墮棿灝卞樊涓嶅鍙互鎺屾彙鍏跺熀鏈潰璨屻傜浉瀵規潵璇達紝絎笁閮ㄥ垎“騫跺彂”浼間箮闅炬帴鍙椾竴浜涖備絾鏄鏋滀綘瀵瑰綰跨▼錛屽悓姝ワ紝娑堟伅闃熷垪榪欎簺涓滆タ寰堟湁緇忛獙鐨勮瘽錛屽瀹冪殑姒傚康涔熶細瀹規槗鐞嗚В銆?br>
2.Go璇█鐨勯潰鍚戝璞?/span>
Go璇█鍦–璇█璇硶鐨勫熀紜涓婏紝浠ユ渶綆媧佺殑褰㈠紡鍔犲叆浜嗛潰鍚戝璞°?br> 鍏充簬緇ф壙錛欸o璇█娌℃湁緇ф壙銆備絾鏄畠鏀寔宓屽叆錛岃繖涓湁鐐圭被浼間簬鍏跺畠璇█鐨刴ixin錛屽彲浠ョ敤鏉ユā鎷熺戶鎵褲?br> 鍏充簬澶氭侊細Go 璇█鐨勬渶澶х壒鐐規槸瀹冪殑鎺ュ彛瀹氫箟銆傛墍璋?#8220;鎺ュ彛”錛屽氨鏄竴緇勬柟娉曠殑闆嗗悎銆備換浣曚竴涓被鍙瀹炵幇浜嗕竴涓帴鍙g殑鎵鏈夋柟娉曪紝鍒欐槸璇ユ帴鍙g殑瀹炵幇鑰咃紝涓嶉渶瑕佹樉寮忓0鏄庡疄鐜拌鎺ュ彛銆傛墍浠ヤ竴涓病鏈変換浣曟柟娉曠殑絀烘帴鍙e彲浠ヤ唬琛ㄤ換浣曠被鍨嬨?br style="FONT-WEIGHT: bold">
3.Go璇█鐨勫茍鍙?/span>
Go璇█鎻愬嚭涓涓柊鐨勬蹇碘擥o渚嬬▼錛屾湁鐐圭被浼間簬綰跨▼錛屼絾鏄洿鍔犺交閲忥紝鏇寸渷璧勬簮銆侴o渚嬬▼涔嬮棿鐨勯氫俊鏂瑰紡 鈥斺斾俊閬擄紝榪欐槸GO 璇█鐨勬牳蹇冩蹇碉紝鏈夌偣綾諱技浜嶶NIX鐨凱ipe銆傚湪Go璇█涓紝涓嶉渶瑕佹帴瑙︾嚎紼嬶紝閿佽繖浜涗綆闃舵蹇點?br>
4.Go璇█鍙互鐢ㄦ潵鍋氫粈涔?/span>
Go璇█鐩墠鏈寮虹殑鏄畠鐨勭綉緇滃姛鑳姐傚畠鐨刾ackage涓凡緇忓疄鐜頒簡鏈甯歌鐨勭綉緇滃崗璁拰緙栫爜澶勭悊銆侴o鐨勫畼鏂圭綉绔欎嬌鐢ㄧ殑灝辨槸Go璇█錛屽疄闄呬笂瀹冨氨鏄疓o鐨勬枃妗g郴緇焔odoc銆?br> 榪樻病鏈夊畼鏂瑰鏁版嵁搴撴敮鎸侊紝涓嶈繃鍥犱負閫氳繃鏌愮鍔炴硶鍙互鍦℅o璇█涓洿鎺ヨ皟鐢–鍑芥暟錛屾墍浠ュ緢瀹規槗鐨勫疄鐜板MYSQL 鎴栬?Sqlite 榪欎簺鏁版嵁搴撶殑鏀寔銆?br> 鑷充簬GUI錛岃繖浼拌鐩墠榪樹笉鍦ㄨ璁¤呯殑鑰冭檻鑼冨洿涔嬪唴錛屽洜涓轟粬浠繛Windows閮戒笉鑸嶅緱鏀寔銆備笉榪囧彲浠ラ氳繃瀹冪殑http鍖呭拰template鍖呯瓑絳夛紝宸茬粡鏋勬垚浜嗕竴涓猈EB妗嗘灦錛屽彲浠ョ敤鏉ュ疄鐜癢EB GUI鐨勫紑鍙戯紝浣跨敤Go鍐欎竴涓甫鏈夎礬寰勫垎媧劇殑Http鏈嶅姟鍣ㄤ篃灝卞嚑琛屼唬鐮佺殑浜嬨?br>
]]>
鏈嶅姟鍣ㄤ嬌鐢–++銆傛敞鎰忓畠鐨勭粨鏋勶細綾?ChatRoom 瀹炵幇浜嗗ぇ閮ㄥ垎鐨勫簲鐢ㄩ昏緫銆備負浜嗘敮鎸佹帹妯″瀷涓庢媺妯″瀷錛屾湇鍔″櫒瀹炵幇浜嗙被ChatSession 鍜岀被 PollingChatSession銆?ChatRoom 璋冪敤 ChatRoomCallbackAdapter 瀵硅薄鐨?send 鍑芥暟鏉ヤ紶閫掑鎴鋒秷鎭紝璇ュ璞¢殣钘忎簡涓ょ妯″瀷涔嬮棿鐨勫樊寮傘?br>
ChatRoom 瀹炵幇錛?br>
ChatRoom鏄竴涓櫘閫氱殑C++瀵硅薄錛岃屼笉鏄竴涓猄ervant.
class ChatRoomCallbackAdapter { /* */ };
typedef IceUtil::Handle<ChatRoomCallbackAdapter> ChatRoomCallbackAdapterPtr;
class ChatRoom : public IceUtil::Shared
{
public:
void reserve(const string&);
void unreserve(const string&);
void join(const string&, const ChatRoomCallbackAdapterPtr&);
void leave(const string&);
Ice::Long send(const string&, const string&);
private:
typedef map<string, ChatRoomCallbackAdapterPtr> ChatRoomCallbackMap;
ChatRoomCallbackMap _members;
set<string> _reserved;
IceUtil::Mutex _mutex;
};
typedef IceUtil::Handle<ChatRoom> ChatRoomPtr;
鎴愬憳鍑芥暟 reserve 鍜?unreserve 緇存姢 _reserved 闆嗗悎銆?/p>
void
ChatRoom::reserve(const string& name)
{
IceUtil::Mutex::Lock sync(_mutex);
if(_reserved.find(name) != _reserved.end() || _members.find(name) != _members.end())
{
throw string("The name " + name + " is already in use.");
}
_reserved.insert(name);
}
void
ChatRoom::unreserve(const string& name)
{
IceUtil::Mutex::Lock sync(_mutex);
_reserved.erase(name);
}
join鎿嶄綔娣誨姞鐢ㄦ埛鍒拌亰澶╁銆?/p>
void
ChatRoom::join(const string& name, const ChatRoomCallbackAdapterPtr& callback)
{
IceUtil::Mutex::Lock sync(_mutex);
IceUtil::Int64 timestamp = IceUtil::Time::now().toMilliSeconds();
_reserved.erase(name);
Ice::StringSeq names;
ChatRoomCallbackMap::const_iterator q;
for(q = _members.begin(); q != _members.end(); ++q)
{
names.push_back((*q).first);
}
callback->init(names);
_members[name] = callback;
UserJoinedEventPtr e = new UserJoinedEvent(timestamp, name);
for(q = _members.begin(); q != _members.end(); ++q)
{
q->second->join(e);
}
}
send瀹炵幇錛屽悓join瀹炵幇闈炲父綾諱技錛?/p>
Ice::Long
ChatRoom::send(const string& name, const string& message)
{
IceUtil::Mutex::Lock sync(_mutex);
IceUtil::Int64 timestamp = IceUtil::Time::now().toMilliSeconds();
MessageEventPtr e = new MessageEvent(timestamp, name, message);
for(ChatRoomCallbackMap::iterator q = _members.begin(); q != _members.end(); ++q)
{
q->second->send(e);
}
return timestamp;
}
class ChatRoomCallbackAdapter : public IceUtil::Shared
{
public:
virtual void init(const Ice::StringSeq&) = 0;
virtual void join(const UserJoinedEventPtr&) = 0;
virtual void leave(const UserLeftEventPtr&) = 0;
virtual void send(const MessageEventPtr&) = 0;
};
鎺ㄦā寮?CallbackAdapter 瀹炵幇錛?
{
public:
SessionCallbackAdapter(const ChatRoomCallbackPrx& callback, const ChatSessionPrx& session) : _callback(callback), _session(session)
{
}
void init(const Ice::StringSeq& users)
{
_callback->init_async(new AMICallback<AMI_ChatRoomCallback_init>(_session), users);
}
void join(const UserJoinedEventPtr& e)
{
_callback->join_async(new AMICallback<AMI_ChatRoomCallback_join>(_session),
e->timestamp,
e->name);
}
void leave(const UserLeftEventPtr& e)
{
_callback->leave_async(new AMICallback<AMI_ChatRoomCallback_leave>(_session),
e->timestamp,
e->name);
}
void send(const MessageEventPtr& e)
{
_callback->send_async(new AMICallback<AMI_ChatRoomCallback_send>(_session),
e->timestamp,
e->name,
e->message);
}
private:
const ChatRoomCallbackPrx _callback;
const ChatSessionPrx _session;
};
鐪嬩竴涓婼essionCallbackAdapter鐨勫洓涓垚鍛樺嚱鏁幫紝褰撳紓姝ヨ皟鐢ㄥ畬鎴愭椂錛岄兘浣跨敤綾籄MICallback鏉ユ帴鏀墮氱煡銆傚畠鐨勫畾涔夊涓嬶細
{
public:
AMICallback(const ChatSessionPrx& session) : _session(session)
{
}
virtual void ice_response()
{
}
virtual void ice_exception(const Ice::Exception&)
{
try
{
_session->destroy(); // Collocated
}
catch(const Ice::LocalException&)
{
}
}
private:
const ChatSessionPrx _session;
};
鎺ㄦā寮忎細璇濆垱寤?/span>錛?br>
鐜板湪鏉ョ湅涓涓嬩細璇濆垱寤恒傛帹妯″紡鐨勫鎴蜂嬌鐢℅lacier2錛屾墍浠ヨ浣跨敤Glacier2鐨勪細璇濆垱寤烘満鍒躲侴lacier2 鍏佽鐢ㄦ埛閫氳繃鎻愪緵涓涓狦lacier2::SessionManager瀵硅薄鐨勪唬鐞嗘潵鑷畾涔変細璇濆垱寤烘満鍒躲傞氳繃璁劇疆Glacier2.SessionManager灞炴ф潵閰嶇疆Gloacier2錛屽氨鍙互浣跨敤鑷繁鐨勪細璇濈鐞嗗櫒銆備細璇濈鐞嗗櫒闄や簡涓涓猼rivial鏋勯犲嚱鏁幫紙璁劇疆鑱婂ぉ瀹ゆ寚閽堬級錛屽彧鏈変竴涓搷浣滐紝create錛孏lacier2璋冪敤瀹冩潵浠g悊搴旂敤鐨勪細璇濆垱寤恒?create 鎿嶄綔蹇呴』榪斿洖涓涓細璇濅唬鐞嗭紙綾誨瀷涓篏lacier2::Session*錛夈傚疄鐜板涓嬶細
ChatSessionManagerI::create(const string& name,
const Glacier2::SessionControlPrx&,
const Ice::Current& c)
{
string vname;
try
{
vname = validateName(name);
_chatRoom->reserve(vname);
}
catch(const string& reason)
{
throw CannotCreateSessionException(reason);
}
Glacier2::SessionPrx proxy;
try
{
ChatSessionIPtr session = new ChatSessionI(_chatRoom, vname);
proxy = SessionPrx::uncheckedCast(c.adapter->addWithUUID(session));
Ice::IdentitySeq ids;
ids.push_back(proxy->ice_getIdentity());
sessionControl->identities()->add(ids);
}
catch(const Ice::LocalException&)
{
if(proxy)
{
proxy->destroy();
}
throw CannotCreateSessionException("Internal server error");
}
return proxy;
}
棣栧厛璋冪敤涓涓畝鍗曠殑甯姪鍑芥暟 validateName, 鏉ユ鏌ヤ紶閫掔殑鐢ㄦ埛鍚嶆槸鍚﹀寘鍚潪娉曞瓧絎︼紝騫舵妸瀹冭漿涓哄ぇ鍐欙紝鐒跺悗璋冪敤 reserver鍑芥暟鎶婂畠鍔犲埌鑱婂ぉ瀹ょ殑_reserved闆嗗悎涓傛垜浠鐩戣榪欎簺鎿嶄綔鎶涘嚭鐨勬秷鎭紝騫舵妸瀹冭漿鍖栦負Glacide2::CannotCreateSessionException寮傚父錛屽嵆鍦╟reate鎿嶄綔鐨勫紓甯歌鑼冨0鏄庣殑寮傚父銆?br> 鎺ョ潃瀹炰緥鍖栦竴涓狢hatSessionI瀵硅薄錛堣涓嬮潰錛夋潵鍒涘緩浼氳瘽銆傛敞鎰忚繖涓細璇濅嬌鐢║UID浣滀負瀵硅薄鏍囪瘑錛屾墍浠ヤ繚璇佹爣璇嗙鍞竴銆?br> 鏈鍚庯紝娣誨姞榪欎釜鏂板垱寤虹殑浼氳瘽鏍囪瘑錛孏llacier2鍙氳繃瀹冩潵杞彂緇忚繃榪欎釜浼氳瘽鐨勮姹傘傚疄闄呬笂錛?#8220;鍙漿鍙戠粡榪囪繖涓細璇濈殑騫朵笖鍙埌榪欎釜浼氳瘽鐨勮姹?#8221;錛岃繖鏄竴縐嶅畨鍏ㄧ殑鍔炴硶錛氬鏋滄湁鎭舵剰瀹㈡埛鑳界寽鍑哄彟涓涓鎴蜂細璇濈殑鏍囪瘑錛屽畠涔熶笉鑳藉悜鍒殑瀵硅薄鍙戦佽姹傦紙鍙兘鍦ㄩ櫎浜嗚亰澶╂湇鍔″櫒涔嬪鐨勬湇鍔″櫒涓婏級銆傚鏋滃嚭閿欙紝灝遍攢姣佸垰鍒涘緩鐨勪細璇濆璞★紝榪欐牱閬垮厤浜嗚祫婧愭硠闇層?br> 榪欏氨鏄埄鐢℅lacier2鍒涘緩浼氳瘽鐨勫叏閮ㄣ傚鏋滀綘甯屾湜浣跨敤Glacier2鐨勮璇佹満鍒訛紝鍙互璁劇疆灞炴lacier2.PermissionsVerifier涓烘墽琛岃璇佺殑瀵硅薄浠g悊銆傦紙Glacier2鎻愪緵涓涓唴緗殑鏉冮檺楠岃瘉鍣紝NullPermissionsVerifier錛屽彲浠ユ鏌ョ敤鎴峰悕鍜屽瘑鐮侊級銆?br> 鍥撅細浼氳瘽鍒涘緩浜や簰鍥撅紙鐣ワ級
ChatSessionI綾誨疄鐜頒簡ChatSession鎺ュ彛銆?br>
{
public:
ChatSessionI(const ChatRoomPtr&, const string&);
virtual void setCallback(const ChatRoomCallbackPrx&, const Ice::Current&);
virtual Ice::Long send(const string&, const Ice::Current&);
virtual void destroy(const Ice::Current&);
private:
const ChatRoomPtr _chatRoom;
const string _name;
ChatRoomCallbackAdapterPtr _callback;
bool _destroy;
IceUtil::Mutex _mutex;
};
typedef IceUtil::Handle<ChatSessionI> ChatSessionIPtr;
鐢變簬Glacier2::create鎿嶄綔涓嶅厑璁鎬紶閫掍唬鐞嗭紝蹇呴』鎶婂垱寤轟細璇濆拰璁劇疆鍥炶皟鍒嗘垚涓ゆ銆傝繖鏄痵etCallback鐨勫疄鐜幫紱
ChatSessionI::setCallback(const ChatRoomCallbackPrx& callback, const Ice::Current& c)
{
IceUtil::Mutex::Lock sync(_mutex);
if(_destroy)
{
throw Ice::ObjectNotExistException(__FILE__, __LINE__);
}
if(_callback || !callback)
{
return;
}
Ice::Context ctx;
ctx["_fwd"] = "o";
_callback = new SessionCallbackAdapter(callback->ice_context(ctx),
ChatSessionPrx::uncheckedCast(
c.adapter->createProxy(c.id)));
_chatRoom->join(_name, _callback);
}
涓鏃﹀鎴瘋皟鐢ㄤ簡setCallback錛屽氨鍙互鎺ユ敹鑱婂ぉ瀹ょ殑鍚勭琛屼負閫氱煡銆備笅涓簊end瀹炵幇錛?/p>
ChatSessionI::send(const string& message, const Ice::Current&)
{
IceUtil::Mutex::Lock sync(_mutex);
if(_destroy)
{
throw Ice::ObjectNotExistException(__FILE__, __LINE__);
}
if(!_callback)
{
throw InvalidMessageException("You cannot send messages until you joined the chat.");
}
string;
try
{
msg = validateMessage(message);
}
catch(const string& reason)
{
throw InvalidMessageException(reason);
}
return _chatRoom->send(_name, msg);
}
瀹㈡埛瑕佺寮鑱婂ぉ瀹わ紝鍙璋冪敤 destory.
ChatSessionI::destroy(const Ice::Current& c)
{
IceUtil::Mutex::Lock sync(_mutex);
if(_destroy)
{
throw Ice::ObjectNotExistException(__FILE__, __LINE__);
}
try
{
c.adapter->remove(c.id);
if(_callback == 0)
{
_chatRoom->unreserve(_name);
}
else
{
_chatRoom->leave(_name);
}
}
catch(const Ice::ObjectAdapterDeactivatedException&)
{
// No need to clean up, the server is shutting down.
}
_destroy = true;
}
]]>
闇姹?br>
1錛変竴涓吀鍨嬬殑鑱婂ぉ瀹ゅ簲鐢紝浣跨敤瀹㈡埛鍣?鏈嶅姟鍣ㄦ灦鏋勶紝瀹㈡埛鍙戦佹秷鎭埌涓績鏈嶅姟鍣紝鐒跺悗錛屾秷鎭彂閫佺粰鍏跺畠瀹㈡埛銆?br> 2錛夊敖閲忓噺灝戞湇鍔″櫒綆$悊錛岀敋鑷沖彲浠ヤ笉闇瑕併?br> 3錛夐氫俊蹇呴』瀹夊叏錛岄氳繃鍏叡緗戠粶鏃跺繀欏昏淇濇姢涓漢闅愮銆?br> 4錛夊綋瀹㈡埛绔拰鏈嶅姟鍣ㄦ湁闃茬伀澧欎繚鎶ゆ椂涔熻兘姝e父榪愯錛屽鎴風涓嶇敤淇敼瀹冪殑緗戠粶鎴栬呴槻鐏璁劇疆銆?br> 5錛夊鎴風鍙互鍦ㄥ悇縐嶅鉤鍙頒笂鍒╃敤澶氱璇█瀹炵幇錛屾瘮濡傝鍒╃敤Web嫻忚鍣ㄤ綔涓哄鎴風銆?br> 6錛夊鎴風鍙兘緗戠粶甯﹀鏈夐檺錛屾墍浠ュ簲璇ュ敖閲忓噺灝戠綉緇滄祦閲忋?br> 鍙敮鎸佸崟涓亰澶╁銆傦紙澶氫釜鑱婂ぉ瀹ゅ彧鏄唬鐮佸浜嗙偣錛屽茍娌℃湁澧炲姞浠諱綍闅懼害錛夈?br>
璁捐
鍦ㄦ湰鏂囦腑錛屽皢浼氭紨紺哄縐嶅鎴風鐨勮璁″拰瀹炵幇銆傚寘鎷細
1錛塁++鍛戒護琛屽鎴風錛?br> 2錛塉AVA SWing GUI瀹㈡埛绔紱
3錛?NET WPF瀹㈡埛绔紱
4錛塒HP緗戦〉瀹㈡埛绔紱
5錛塖ilverlight 緗戦〉瀹㈡埛绔紱
娉ㄦ剰錛屽浜嶪CE3.3, PHP鍜孯uby鍙彁渚涗簡瀹㈡埛绔殑Run Time銆傛垜浠湪鑰冭檻褰撹繛鎺ョ殑瀹㈡埛濡備綍浠庢湇鍔″櫒鑾峰緱娑堟伅鏃訛紝蹇呴』瑕佹兂鍒拌繖涓鐐廣傚浜庢秷鎭彂甯冿紝鏈変袱縐嶉氫俊妯″瀷錛?br> 1錛夋帹妯″瀷錛氱暐
2錛夋媺妯″瀷錛氱暐
鎺ㄦā鍨嬫瘮杈冪畝鍗曪紝瀹規槗瀹炵幇錛屾垜浠殑Chat 瀹㈡埛绔腑錛孋++錛孞ava, .Net, Silverlight(0.3)閮戒嬌鐢ㄨ妯″瀷銆侾HP瀹㈡埛绔嬌鐢ㄦ媺妯″瀷銆?br>
鎺ㄦā鍨嬪畾涔?br> 姣忎釜瀹㈡埛绔腑鎻愪緵涓涓?ChatRoomCallback 綾誨瀷鐨処CE瀵硅薄鍒版湇鍔″櫒銆傚綋鍙戠敓浜嬩歡鏃訛紝鏈嶅姟鍣ㄨ皟鐢ㄨ瀵硅薄鐨勬搷浣滈氱煡瀹㈡埛銆係LICE瀹氫箟濡備笅錛?br>
module Chat
{
// Implemented by clients
interface ChatRoomCallback
{
["ami"] void init(Ice::StringSeq users);
["ami"] void join(long timestamp, string name);
["ami"] void leave(long timestamp, string name);
["ami"] void send(long timestamp, string name, string message);
};
};
1錛夊綋鐢ㄦ埛棣栨榪炴帴鍒拌亰澶╁鏃訛紝鏈嶅姟鍣ㄨ皟鐢?init 鎿嶄綔. users鍙傛暟鍛婅瘔鐢ㄦ埛鐩墠榪炴帴鍒拌亰澶╁鐨勬墍鏈夌敤鎴蜂俊鎭?br> 2錛夋湁鐢ㄦ埛榪炴帴鍒拌亰澶╁鏃訛紝鏈嶅姟鍣ㄨ皟鐢?join 鎿嶄綔銆?br> 3錛夋湁鐢ㄦ埛鏂紑榪炴帴鏃訛紝鏈嶅姟鍣ㄨ皟鐢?nbsp;leave 鎿嶄綔銆?br> 4錛夋湁鐢ㄦ埛鍙戦佹秷鎭椂錛屾湇鍔″櫒璋冪敤 send 鎿嶄綔銆?br> 娉ㄦ剰璁捐浣跨敤寮傛浜嬩歡銆傚厓鏁版嵁鎸囦護 ["ami"] 鏍囨槑鏈嶅姟鍣ㄥ紓姝ヨ皟鐢ㄥ洖璋冩搷浣溿傚綋瀹㈡埛绔涓哄紓甯告椂錛岃繖瀵規湇鍔″櫒鏄竴涓繚鎶わ細瀹㈡埛绔彲鑳介暱鏃墮棿闃誨錛屾湇鍔″櫒璋冪敤鏈熼棿涓嶄細鍥犳澶卞幓瀵圭嚎紼嬬殑鎺у埗銆?br>
涓庨槻鐏鍗忎綔
鐣?.....
Glacer2鏄疘CE閽堝榪欑鎯呭喌鐨勯寤虹殑瑙e喅鏂規錛屽畠鎵紨涓涓湇鍔″櫒鍓嶇銆侴lacer2鍏鋒湁浠ヤ笅鐗瑰緛錛?br> 1錛夋敮鎸佷細璇濇蹇碉紝API鏀寔璁よ瘉鏈哄埗錛屽彲瀹炵幇鑷畾涔夌殑浼氳瘽鍒涘緩鍜岃璇併?br> 2錛夊崟涓狦lacer2鍙繘琛屼換鎰忔暟閲忕殑鏈嶅姟鍣ㄥ拰瀹㈡埛绔漿鍙戙傛湇鍔″櫒鍙鏈変竴涓鍙f帴鍙楀鏉ヨ繛鎺ワ紝鑰屼笉鐢ㄧ鍏蜂綋鏈嶅姟鍣ㄤ釜鏁般?br> 3錛夊浜庡叿鏈夐槻鐏鐨勫鎴風錛屾湇鍔″櫒涔熷彲璋冪敤鍏舵彁渚涚殑鍥炶皟銆?br>
鍥犱負 Glacer2浼氳瘽姒傚康鏄潰鍚戣繛鎺ョ殑錛屽彧鏈夊綋瀹㈡埛绔悓Glacer2鐨勮繛鎺ユ墦寮鏃訛紝鏇寸簿紜殑璇達紝鍚孏lacer2淇濇寔涓涓縺媧葷殑浼氳瘽鏃訛紝鏈嶅姟鍣ㄦ墠鍙互瀵瑰鎴瘋繘琛屽洖璋冦傛崲鍙ヨ瘽璇達紝褰撳鎴風鍚孏lacer2澶卞幓榪炴帴錛孏lacer2鑷姩閿姣佷細璇濄備負浜嗛樆姝㈠鎴風鍒癎lacer2鐨勮繛鎺ヨ鎰忓鍏抽棴錛屽鎴風蹇呴』瑕佺鐢ˋCM錛圓utomic Connection Management, 鑷姩榪炴帴綆$悊錛夈傝屼笖錛孏lacer2閫氬父瀵歸暱鏃墮棿絀洪棽鐨勪細璇濊緗秴鏃躲傚綋鑱婂ぉ瀹ら暱鏃墮棿娌℃湁鍔ㄤ綔鏃訛紝涓轟簡闃叉Glacer2閿姣佷細璇濓紝瀹㈡埛绔繀欏誨懆鏈熸ц繘琛屾縺媧伙紝姣斿錛岃皟鐢?ice_ping, 鏉ュGlacer2鐨勪細璇濊秴鏃惰繘琛岄噸緗?br>
Chat瀹㈡埛绔氳繃鏈嶅姟鍣ㄦ彁渚涚殑 ChatSession鎺ュ彛鏉ュ拰鏈嶅姟鍣ㄩ氫俊銆?ChatSession 浠嶨lacer2::Session媧劇敓銆?br>
module Chat
{
exception InvalidMessageException
{
string reason;
};
interface ChatSession extends Glacier2::Session
{
void setCallback(ChatRoomCallback* cb);
["ami"] long send(string message) throws InvalidMessageException;
};
};
榪欏氨鏄帹妯″瀷錛孋hat瀹㈡埛绔皟鐢–hatSession鐨剆end鏉ュ彂閫佹秷鎭紝鏈嶅姟鍣ㄨ皟鐢ㄦ瘡涓涓鎴風殑ChatRoomCallback鐨剆end鎿嶄綔榪涜鍒嗗彂銆?br>
鎷夋ā鍨嬪畾涔?br>
TODO
]]>
]]>
]]>
銆銆瀵逛簬浣跨敤綰跨▼姹犵殑Reactor妯″紡錛岄拡瀵規瘡涓涓猄OCKET鍙ユ焺鐨勪簨浠跺鐞嗗櫒handler鍙兘琚垎媧懼埌涓嶅悓鐨勭嚎紼嬪綋涓紝榪欏氨瑕佹眰handler鐨勬瘡涓涓搷浣滈兘鏄嚎紼嬪畨鍏ㄧ殑銆?br>銆銆鍙互浣跨敤涓縐嶅姙娉曚嬌涓涓猦andler鐨勬搷浣滃彧鑳藉垎媧懼埌涓涓嚎紼嬩腑錛氫負姣忎竴涓猦andler璁懼畾涓涓嚎紼嬫墍鏈夎咃緝錛わ紝涓寮濮嬶緝錛や負絀猴紝鍒欐瘡涓嚎紼嬮兘鍙互鍒嗘淳錛岀涓嬈″垎媧句箣鍚庯紝鍒欒瀹氫負璇ョ嚎紼嬶緝錛わ紝浠ュ悗鍙垎媧懼埌璇ョ嚎紼嬩腑銆傝繖鏍鳳紝鍙互淇濊瘉handler鎿嶄綔鐨勫崟綰跨▼鎬э紝綆鍖栦互鍚巋andler鐨勫叿浣撳疄鐜般傝繖涓緝錛や篃鍙互鐏墊椿璁劇疆錛屼互閫傚簲鍏蜂綋浜嬪姟鐨勮姹傘?br>銆銆浣嗚繖鏍峰茍涓嶈兘淇濊瘉handler褰誨簳鏃犻攣錛屽洜涓鴻繕浼氭湁涓や釜綰跨▼浼氬嚭鐜扮珶浜夛紝闄や簡榪欎釜浜嬩歡澶勭悊綰跨▼浠ュ錛岃繕鏈変簨浠跺垎媧劇嚎紼嬶紙鍗充簨浠朵睛鍚嚎紼嬶級銆傚浜庤繖涓棶棰樼殑瑙e喅鍔炴硶濡備笅錛氫負姣忎釜handler璁懼畾涓涓師瀛愯鏁幫紝浜嬩歡鍒嗘淳綰跨▼鍦ㄥ垎媧句簨浠跺墠錛岄鍏堣瀹氳鍘熷瓙璁℃暟錛岃嫢璁劇疆澶辮觸錛岃〃鏄庢鏃舵鏈夊叾瀹冪嚎紼嬪湪澶勭悊璇andler錛屽垯騫朵笉鍒嗘淳璇ヤ簨浠訛紝鑰屾槸灝嗗畠緗簬涓涓猵ending闃熷垪涓紝絳夊緟浠ュ悗鍒嗘淳銆?br> 銆銆榪樻湁涓縐嶇畝鍗曠殑鏂規硶錛屽氨鏄皢璇andler鐩存帴鎸傝搗錛屽鐞嗗畬鍚庢墠鍏佽榪涜浜嬩歡鍒嗘淳銆?
]]>