我们一起学习WCF 第九篇聊天功能

说到聊天,那么其实就是传输数据,把自己写的东西传给自己想发送的那么人。我总结一下传输有三种方式

1:就是我们常见的数据库传输

2:就是文件(流)传输

3:就是socket传输

今天我们说的wcf实现聊天其实是基于socket的聊天功能(QQ聊天发展到今天肯定是很牛的了,但是最初肯定也是这样的思想)

今天我先说说基于WCF聊天的原理

1:需要一个回调函数(当用户发送的时候会吧信息回调给客户端本身)

2:需要一个委托(把服务器传来的信息显示给前台)

3:需要一个触发点击事件(目的是为了触发把发送信息传到服务器)

基本主要由以上三个就能完成这个简单的聊天功能,下面我用图来描述我这个程序的基本流程

ok现在和我一起进行编码:

第一步:我们建立回调接口

1    [ServiceContract]
2   public interface ICallBack
3     {
4         [OperationContract(IsOneWay = true)]
5         void SendMessage(string nick, string Onick, string content, DateTime sendTime);
6     }

第二步:我们建立两个类,一个作为返回用户登录信息类,一个用户发送信息类

 1 ///
 2 发送类
 3 ///
 4 public class SendInfo
 5     {
 6        /// <summary>
 7        /// 发送者名字
 8        /// </summary>
 9        public string SendName { get; set; }
10        /// <summary>
11        /// 接受者名字
12        /// </summary>
13        public string RevName { get; set; }
14        /// <summary>
15        ///  发送内容
16        /// </summary>
17        public string SendContent { get; set; }
18        /// <summary>
19        /// 发送时间
20        /// </summary>
21        public DateTime SendTime { get; set; }
22        /// <summary>
23        /// 聊天模式(0表示群聊,1表示单聊)
24        /// </summary>
25        public int State { get; set; }
26     }
27 ///
28 错误信息
29 ///
30
31     [DataContract]
32    public class ResultMessage
33     {
34         /// <summary>
35         /// 错误信息
36         /// </summary>
37         [DataMember]
38         public string ErrorMessage { set; get; }
39         /// <summary>
40         /// 是否登录成功
41         /// </summary>
42         [DataMember]
43         public bool IsTrue { set; get; }
44     }

第三步:建立契约

 1   [ServiceContract(CallbackContract = typeof(ICallBack), SessionMode = SessionMode.Required)]
 2    public interface IChatService
 3     {
 4         [OperationContract( IsInitiating = true, IsTerminating = false)]
 5         ResultMessage Login(string UserName, string Pwd);
 6         [OperationContract(IsOneWay = true)]
 7         void sendMessage(SendInfo sendInfo);
 8         [OperationContract(IsInitiating = false, IsTerminating = true)]
 9         ResultMessage End(string UserName);
10     }

第四步:实现功能

 1  public void sendMessage(SendInfo sendInfo)
 2         {
 3             if (sendInfo.State == 0)
 4             {
 5                 if (Clients != null)
 6                 {
 7                     foreach (ICallBack cb in Clients.Values.ToArray())
 8                     {
 9                         if (cb != null)
10                         {
11                             cb.SendMessage(sendInfo.SendName, sendInfo.RevName, sendInfo.SendContent, sendInfo.SendTime);
12                         }
13                     }
14                 }
15             }
16             else
17             {
18                 if (Clients.ContainsKey(sendInfo.RevName))
19                 {
20                     ICallBack cb1 = Clients[sendInfo.RevName];
21                     cb1.SendMessage(sendInfo.SendName, sendInfo.RevName, sendInfo.SendContent, sendInfo.SendTime);
22                     ICallBack cb2 = Clients[sendInfo.SendName];
23                     cb2.SendMessage(sendInfo.SendName, sendInfo.RevName, sendInfo.SendContent, sendInfo.SendTime);
24                 }
25                 else
26                 {
27                     ICallBack cb = Clients[sendInfo.SendName];
28                     cb.SendMessage(sendInfo.SendName, sendInfo.RevName, "对方不在线", sendInfo.SendTime);
29                 }
30             }
31         }

注释1:Clients.Values.ToArray() 获取所有的用户信息,然后得到通道给每一个用户发送信息

注释2:ICallBack cb1 = Clients[sendInfo.RevName]; 获取回调接口,然后通过接口来返回用户发送信息

第五步:客户端实现回调接口

  public event EventHandler<CallbackRecEventArgs> ChatEvent;
        public void SendMessage(string NickOne, string NickTwo, string Message, DateTime sendTime)
        {
            CallbackRecEventArgs crg = new CallbackRecEventArgs(NickOne, NickTwo, Message, sendTime);
            ChatEvent(this, crg);
        }

注释3:建立事件的目的是为了把信息传给前台进行显示

第六步:客户端实现

请参照我传的源码

第七步:看看运行效果

单聊效果

群聊效果:

如果遇到什么地方不懂的可以私信给我

附上源码

时间: 2024-10-10 22:47:01

我们一起学习WCF 第九篇聊天功能的相关文章

[老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端与客户端在通信时有三种模式:单向模式.请求/应答模式和双工模式. 如果选用了单向模式,调用方在向被调用方进行了调用后不期待任何回应,被调用方在执行完调用后不给调用方任何反馈.如客户端通过单向模式调用了一个服务端的操作后,就去干别的了,不会等待服务端给他任何响应,他也无从得知调用是否成功,甚至连发生了

老老实实学习WCF[第二篇] 配置wcf

老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: [csharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Description; name

我们一起学习WCF 第一篇初识WCF(附源码供对照学习)

前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wcf所遇到的困难以及解决方案一点点记下来,可能还有很多不足之处那我们一起共同学习.在学习之前我们有必要初步的看下百度百科对wcf的解释,让我们心中有这一个概念,然后建立项目,然后再次看概念,然后在去更深层的建立项目,然后再去理解这样反复的去做我相信可以做好wcf.那么下面我就会从初识wcf,wcf消息

Python学习【第九篇】函数

函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过程中最常见的操作就是复制粘贴,就是将之前实现的代码块复制到现需功能处,如下: 1 while True: 2 if cpu利用率 > 90%: 3 #发送邮件提醒 4 连接邮箱服务器 5 发送邮件 6 关闭连接 7 8 if 硬盘使用空间 > 90%: 9 #发送邮件提醒 10 连接邮箱服务器 1

我们一起学习WCF 第二篇WCF承载多个接口

前言:现在王大叔养了大批猪,赚了很多钱.但是最近发现养鸡也可以赚很多钱,他就像扩展业务开始养鸡.又过两年他发现市场对狗的需求量很大,他开始养狗.那么他改怎么做呢,不可能去修改猪住的地方把鸭子和狗放里面那么维护起来非常不便,那么我们就要进行扩展,在盖一个鸭圈和一个狗圈.现在我们看下图 第一步:定义三个接口 1 养猪契约 2 /// <summary> 3 /// 服务契约 4 /// </summary> 5 [ServiceContract] 6 public interface

MySQL数据库学习【第九篇】索引原理与慢查询优化

一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 2.为什么要有索引呢? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询性能优化最有效的手段了.

[Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能

一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少了不像QQ一样的端对端的聊天了.本篇博文将介绍如何使用SignalR来实现类似QQ聊天的功能. 二.使用SignalR实现端对端聊天的思路 在介绍具体实现之前,我先来介绍了使用SignalR实现端对端聊天的思路.相信大家在前篇文章已经看到过Clients.All.sendMessage(name,

学习java随笔第九篇:java异常处理

在java中的异常处理和c#中的异常处理是一样的都是用try-catch语句. 基本语法如下 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally语句 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally { //此处是肯定被执行的代码 } 抛出异常 使用thows和throw语句抛出异常 public static vo

第九篇 SQL Server代理了解作业和安全

本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这系列的前几篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本,甚至自己的程序.你最好的选择是使用PowerShell的子系统运行PowerShell脚本.PowerShell脚本将允许你处理几乎所有方面的Windows和SQL Server问题.在这一篇,你会深入到SQL Server代理安全.安全是个令人困惑的话题,它值得一些明确的考虑.这系列有两个不同方面