日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ICE专题:实现简单的聊天室(一)

發布時間:2023/12/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。

using System; using System.Collections.Generic; using System.Text;using ChatSpaceDef;namespace Client {public sealed class CallBackI:CallBackDisp_{public override void GetInput(string content, Ice.Current current__){System.Console.WriteLine("服務器傳遞過來的信息:{0} Say:{1}",current__.ctx["user_name"],content);}} } 客戶端主程序Client.cs:?using System; using System.Collections.Generic; using System.Text;using ChatSpaceDef;namespace Client {class Client : Ice.Application{static void Main(string[] args){Client app = new Client();int status = app.main(args, "config.client");if (status != 0){System.Environment.Exit(status);}}public override int run(string[] args){ChatSpacePrx spacePrx = ChatSpacePrxHelper.checkedCast(communicator().propertyToProxy("Callback.CallbackServer"));if (spacePrx == null){System.Console.WriteLine("網絡配置無效!");return 1;}System.Console.WriteLine("請輸入用戶名:\r\n");string user_name = Console.ReadLine();if (spacePrx.Register(user_name) == false){System.Console.WriteLine("該用戶名已被注冊!");return 1;}Ice.ObjectAdapter adapter = communicator().createObjectAdapter("Callback.Client");adapter.add(new CallBackI(), communicator().stringToIdentity("callbackReceiver"));adapter.activate();CallBackPrx callbackPrx = CallBackPrxHelper.uncheckedCast(adapter.createProxy(communicator().stringToIdentity("callbackReceiver")));Ice.Context ctx = new Ice.Context();ctx.Add("user_name", user_name);spacePrx.SetupCallback(callbackPrx,ctx);System.Console.WriteLine("請輸入聊天內容:\r\n");string content = "";while (content != "X") {content = System.Console.ReadLine();spacePrx.SetInput(content,ctx); }spacePrx.Unregister(ctx);return 0;}} } 客戶端配置文件:

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专题:实现简单的聊天室(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。