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

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

主站蜘蛛池模板: 欧美日韩大陆 | 毛片久久久久 | 国产主播在线一区 | xxxxxx日本 | 天天干天天日夜夜操 | 欧美性猛交xxx乱大交3 | 国 产 黄 色 大 片 | 精品肉丝脚一区二区三区 | 日本黄页视频 | 伊人久久综合 | 精品免费国产一区二区三区四区 | aaaa免费视频 | 国产色婷婷一区二区 | 久久久精品视频在线 | 国产精品桃色 | 亚洲一级Av无码毛片久久精品 | 国产免费小视频 | 久久免费视频3 | 国产美女无遮挡永久免费 | 波多野结衣视频在线观看 | 高清久久久久久 | 亚洲一区二区三区四区不卡 | 欧美二区在线观看 | 成人网站在线进入爽爽爽 | 久久久久免费精品视频 | 精品中出 | 性色av蜜臀av色欲av | 精品不卡在线 | 久久久久久久久影院 | 一区二区三区 欧美 | 亚洲精品在线播放视频 | 亚洲精品高清视频在线观看 | 新呦u视频一区二区 | 国产激情视频在线观看 | 国产美女无遮挡免费视频 | 娇妻被老王脔到高潮失禁视频 | 国产只有精品 | 亚洲网在线 | 日韩超碰 | 337p日本欧洲亚洲大胆张筱雨 | 欧美黄视频 | 日本阿v视频| 国产三级国产精品 | 91成人观看| 中国黄色免费网站 | 久久97精品久久久久久久不卡 | 国产三级小视频 | 国产伦精品一区二区三区妓女下载 | 日韩精品观看 | 日本一区二区三区四区五区 | 久久国精品 | 欧美日韩人妻精品一区二区三区 | 欧美激情欧美激情在线五月 | 欧美视频在线观看一区 | 亚洲免费视频观看 | 久久精品国产亚洲AV熟女 | 欧美激情图区 | 永久免费的av网站 | 欧美三根一起进三p | 香港三级在线视频 | 国产极品美女高潮无套在线观看 | 久久久久亚洲AV成人无码国产 | 伊人久操| 天天干天天天 | 一级全黄色片 | 国产免费黄色片 | 成人在线短视频 | 好色视频tv| 久久中文字幕一区 | 亚洲欧美日韩成人 | 精品乱码一区二区三区四区 | 动漫美女无遮挡免费 | 欧美精品久久96人妻无码 | 老头吃奶性行交 | 日本一区二区不卡在线 | 亚洲欧美一 | 91精品综合久久 | 中文字幕资源站 | 欧美性猛交xxxx黑人猛交 | 黄色一几片 | 天堂成人网 | 免费美女毛片 | 国产午夜一级片 | 亚洲视频一 | 波多野结衣av在线播放 | 日产电影一区二区三区 | 中国吞精videos露脸 | 成人三级在线视频 | 午夜亚洲精品 | 91免费在线播放 | 欧美精品久久99 | 国产精品区在线观看 | 久久泄欲网 | 狠狠综合久久av一区二区 | 天天天色 | 日本大尺度电影免费观看全集中文版 | 深夜啪啪 | 黄色免费在线播放 | 日韩在线视频不卡 |