ICE专题:实现简单的聊天室(一)
生活随笔
收集整理的這篇文章主要介紹了
ICE专题:实现简单的聊天室(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目標:實現一個簡單的聊天室。本文實現的聊天室僅出于演示ICE的多播功能,即由一個Client發送的消息,廣播至注冊的其他Client上。以后的系列文章,將逐步完善這個例子,使其成為一個現實意義上可用的聊天室軟件。
Slice定義:
?
module ChatSpaceDef {//回調函數接口,就是客戶端傳遞給服務器,服務器接收到的一個方法代理簽名interface CallBack{void GetInput(string content);};//在線列表dictionary<string,CallBack *> CacheMap;//聊天室功能列表interface ChatSpace{bool Register(string name);//注冊void SetInput(string content);//發送消息void Unregister();//退出void SetupCallback(CallBack * cp);//設置回調};};運行命令:slice2cs --output-dir generated *.ice此命令將生成Client和Server都要使用的應用程序骨架ChatSpaceDef.cs文件。要了解該文件的類的所有信息,請參考Ice用戶手冊。定義服務器端
對服務器而言,實現ChatSpaceDisp_抽象基類即可,換言之,需要實現:bool Register(string name);//注冊void SetInput(string content);//發送消息void Unregister();//退出void SetupCallback(CallBack * cp);//設置回調
這4個方法。代碼如下:
using System; using System.Collections.Generic; using System.Text; using ChatSpaceDef;namespace ChatSpace {public sealed class ChatSpaceI : ChatSpaceDisp_{public override bool Register(string name, Ice.Current current__){Console.WriteLine("驗證 {0} 是否被注冊了!", name);return !m_cache_map.Contains(name);}public override void SetInput(string content, Ice.Current current__){
//向其他人廣播消息string user_name = current__.ctx["user_name"];foreach (string key in m_cache_map.Keys){if (key == user_name){continue;}m_cache_map[key].GetInput(content, current__.ctx);}}public override void Unregister(Ice.Current current__){if (current__.ctx["user_name"] != null){m_cache_map.Remove(current__.ctx["user_name"]);Console.WriteLine("注銷{0}成功", current__.ctx["user_name"]);} }public override void SetupCallback(CallBackPrx cp, Ice.Current current__){ if (current__ != null && current__.ctx["user_name"] != null){string user_name = current__.ctx["user_name"];Console.WriteLine("上下文是user_name={0}", user_name);m_cache_map.Add(user_name, cp);}else{throw new Exception("上下文錯誤!");}}CacheMap m_cache_map = new CacheMap();} } 上述代碼都非常簡單易懂,需要解釋的是:Ice.Current表示調用者攜帶的上下文信息,這是Ice的內部機制,你可以在方法調用上,通過Context對象攜帶其他與調用相關的信息,注意,它不是方法調用的參數,它是Client和Server在網絡中網絡環境下傳遞信息的一種載體。
定義Server端配置config.server:
Callback.Server.Endpoints=tcp -p 12345:udp -p 12345# # Warn about connection exceptions # Ice.Warn.Connections=1# # Network Tracing # # 0 = no network tracing # 1 = trace connection establishment and closure # 2 = like 1, but more detailed # 3 = like 2, but also trace data transfer # #Ice.Trace.Network=1# # Protocol Tracing # # 0 = no protocol tracing # 1 = trace protocol messages # #Ice.Trace.Protocol=1# # Security Tracing # # 0 = no security tracing # 1 = trace messages # #IceSSL.Trace.Security=1 server端的主程序非常簡單Server.cs:
using System; using System.Collections.Generic; using System.Text;namespace ChatSpace {public class Server : Ice.Application{public override int run(string[] args){Ice.ObjectAdapter adapter = communicator().createObjectAdapter("Callback.Server"); adapter.add(new ChatSpaceI(), communicator().stringToIdentity("callback"));adapter.activate();communicator().waitForShutdown();return 0;}public static void Main(string[] args){Server app = new Server();int status = app.main(args, "config.server");if (status != 0){System.Environment.Exit(status);}}} } ??
?
定義客戶端
對客戶端而言,只需要實現回調方法即可了CallBackI.cs。
Callback.CallbackServer=callback:tcp -p 12345:udp -p 12345 Callback.Client.Endpoints=tcp:udp# # Warn about connection exceptions # Ice.Warn.Connections=1# # Network Tracing # # 0 = no network tracing # 1 = trace connection establishment and closure # 2 = like 1, but more detailed # 3 = like 2, but also trace data transfer # #Ice.Trace.Network=1# # Protocol Tracing # # 0 = no protocol tracing # 1 = trace protocol messages # #Ice.Trace.Protocol=1# # Security Tracing # # 0 = no security tracing # 1 = trace messages # #IceSSL.Trace.Security=1至此,一個多播聊天室就此完成。
編譯運行:
?ICE,SQLite,JasperReport……開源技術討論群:25935569,歡迎關注開源技術應用的朋友一起交流進步。
項目下載:項目文件 ICEChatSpace
轉載于:https://www.cnblogs.com/hzuIT/articles/739388.html
總結
以上是生活随笔為你收集整理的ICE专题:实现简单的聊天室(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: realme GT3 240W 快充手机
- 下一篇: 来到了广州