目标:实现一个简单的聊天室。本文实现的聊天室仅出于演示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专题:实现简单的聊天室(一)相关推荐

  1. SpringBoot入门建站全系列(二十七)WebSocket做简单的聊天室

    SpringBoot入门建站全系列(二十七)WebSocket做简单的聊天室 一.概述 WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 ...

  2. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

  3. Application对象 简单的聊天室

    使用Application对象可以使得多个用户在访问同一个asp.net应用程序时,能够共享信息,在多个用户同时访问asp.net时,都会产生一个Application对象.通常可以把共享的数据变量存 ...

  4. java 简单的聊天室_Java简单聊天室

    实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * *简单的多人聊天系统--重点:同时性,异步性 *1.客户端:发送消 ...

  5. 用ServletContext做一个简单的聊天室

    这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...

  6. Netty - 一个简单的聊天室小项目

     经过一段时间对Netty的学习,我们对Netty各版本以及像ProtocolBuffers等技术应用都有了不少相关的了解, 我们就用这段时间学到的只是做一个简单的聊天室的小项目来练习自己学到的技术. ...

  7. python开发一个简单的聊天室

    使用python的twisted框架编写一个简单的聊天室 下面是基本架构 基本架构图 -- coding:utf-8 -- from twisted.internet.protocol import ...

  8. 局域网服务器发送消息,Java实现简单局域网聊天室

    本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方 ...

  9. java udp 聊天室_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. ...

最新文章

  1. 动态生成能够局部刷新的验证码【AJAX技术】---看了不懂赔你钱
  2. Markdown = PPT ?这个工具给力!
  3. JS 总结之函数、作用域链
  4. 如何正确应对在线故障
  5. oVirt Reports Portal 3.4 added to ovirt-engine
  6. 2017蓝桥杯省赛---java---B---7(日期问题)
  7. 文本文件与二进制文件
  8. [NOIP2006] 能量项链
  9. 30 张快速学习 Java 的思维导图
  10. sqlserver200864位下载_sql2008r2企业版下载-sql2008r2安装包64位 最新版 - 极光下载站...
  11. Hexo博客新建文章以及Next主题多层级分类
  12. 如何清空c盘只剩系统_如何清除c盘除系统外所有垃圾
  13. 计算机excel乘法函数公式,excel乘法函数
  14. 手机5款令人爱不释手的APP 好用到爆
  15. 无理数究竟是什么?连续性公理的产物?——读戴德金之二
  16. 在腾讯云上搭建基于Nodejs的网站
  17. 餐厅预订系统如何选?餐厅预订系统推荐
  18. 基于springboot框架开发的作业提交与批改系统
  19. python len ljust_python中ljust的用法
  20. CSS3干货14:自定义页面滚动条

热门文章

  1. 【.NET深呼吸】基础:自定义类型转换
  2. NSArray创建和使用
  3. Arduino 各种模块篇 步进电机 step motor( 不用库,不用shield, 纯)
  4. WebService开发中SoapException的用法
  5. C# winform 多线程中创建等待窗体
  6. C#中开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨
  7. 浅析C语言中strtol()函数与strtoul()函数的用法
  8. linux ssh和scp,Linux SSH 与 SCP命令简述
  9. 开发安卓app游戏_电竞直播APP软件定制开发,游戏直播APP开发方案
  10. java 部署环境_Centos7部署JAVA环境