zoukankan      html  css  js  c++  java
  • 重温WCF之群聊天程序(十)

    完成的效果图:

    服务器端代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SendMessageHostConsoleApplication
    {
        [ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(ICallback))]
        public interface IService
        {
            /// <summary>
            /// 启动会话
            /// </summary>
            [OperationContract(IsOneWay=true,IsInitiating=true,IsTerminating=false)]
            void Begin();
    
            /// <summary>
            /// 客户端调用服务器端发送消息
            /// </summary>
            /// <param name="nick"></param>
            /// <param name="msg"></param>
            /// <param name="sendTime"></param>
            [OperationContract(IsOneWay = true)]
            void SendMessage(string nick,string msg,DateTime sendTime);
    
            /// <summary>
            /// 终止会话
            /// </summary>
            [OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)]
            void End();
    
        }
    
        public interface ICallback
        {
            /// <summary>
            /// 服务器端调用客户端发送消息
            /// </summary>
            /// <param name="nick"></param>
            /// <param name="msg"></param>
            /// <param name="sendTime"></param>
            [OperationContract(IsOneWay=true)]
            void SendToClients(string nick,string msg,DateTime sendTime);
        }
    
        [ServiceBehavior(IncludeExceptionDetailInFaults=true,InstanceContextMode=InstanceContextMode.PerSession)]
        public class MyService : IService
        {
            public static Dictionary<string, ICallback> ClientCallBacks = new Dictionary<string, ICallback>();
            public void Begin()
            {
                string sessionId = OperationContext.Current.SessionId;
                ICallback cb = OperationContext.Current.GetCallbackChannel<ICallback>();
                MyService.ClientCallBacks[sessionId] = cb;
            }
    
            public void SendMessage(string nick, string msg, DateTime sendTime)
            {
                foreach (ICallback  c in MyService.ClientCallBacks.Values)
                {
                    if (c != null)
                    {
                        c.SendToClients(nick, msg, sendTime);
                    }
                }
            }
    
            public void End()
            {
                string sessionId = OperationContext.Current.SessionId;
                if (MyService.ClientCallBacks.ContainsKey(sessionId))
                {
                    MyService.ClientCallBacks.Remove(sessionId);
                }
            }
        }
        public class Program
        {
            public static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(MyService)))
                {
                    NetTcpBinding bingding = new NetTcpBinding();
                    bingding.Security.Mode = SecurityMode.None;//不需要安全模式
                    host.AddServiceEndpoint(typeof(IService), bingding, "net.tcp://127.0.0.1:8868/channel");
    
                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                    behavior.HttpGetEnabled = true;
                    behavior.HttpGetUrl = new Uri("http://127.0.0.1:8888/WSDL"); //httpGetUrl客户端引用的地址
                    host.Description.Behaviors.Add(behavior);
                    host.Opened += delegate
                    {
                        Console.WriteLine("服务已启动");
                        Console.ReadKey();
                    };
                    host.Open();
                }
            }
        }
    }

    客户端调用代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.ServiceModel;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace SendMessageClientWindowsFormsApplication
    {
        
        public partial class Form1 : Form
        {
            private WS.ServiceClient client = null;
            public Form1()
            {
                InitializeComponent();
                MyCallback callback = new MyCallback();
                callback.MessageReceived += callback_MessageReceived;
                var instanceContext = new InstanceContext(callback);
                client = new WS.ServiceClient(instanceContext);
                client.Begin();
                this.FormClosed += Form1_FormClosed;
            }
    
            void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                client.End();
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
         
                client.SendMessage(this.txtNick.Text, this.txtSendMsg.Text, DateTime.Now);
            }
    
            void callback_MessageReceived(object sender, CallbackRecEventArgs e)
            {
                ListViewItem item = new ListViewItem();
                Font font = new System.Drawing.Font(new FontFamily("宋体"), 12,FontStyle.Bold);
                item.Font = font;
                item.ForeColor = Color.Blue;
                if (e.Nick == this.txtNick.Text)
                {
                    item.ForeColor = Color.Green;
                }
                item.Text = e.Nick + "        " + e.SendTime+"
    ";
                listView1.Items.Add(item);
                listView1.Items.Add(e.Message);
                this.txtSendMsg.Text = "";
            }
        }
    
        public class MyCallback : WS.IServiceCallback
        {
            public void SendToClients(string nick, string msg, DateTime sendTime)
            {
                if (this.MessageReceived != null)
                {
                    CallbackRecEventArgs arg = new CallbackRecEventArgs(nick, msg, sendTime);
                    this.MessageReceived(this, arg);
                }
            }
    
            public event EventHandler<CallbackRecEventArgs> MessageReceived;
        }
    
        public class CallbackRecEventArgs : EventArgs
        {
            private string _Nick, _Msg;
            private DateTime _time;
    
            public CallbackRecEventArgs(string nk, string m, DateTime t)
            {
                _Nick = nk;
                _Msg = m;
                _time = t;
            }
    
            public string Nick
            {
                get { return _Nick; }
            }
    
            public string Message
            {
                get { return _Msg; }
            }
    
            public DateTime SendTime
            {
                get { return _time; }
            }
        }
    
    }
  • 相关阅读:
    rabiitmq 消息丢失处理
    后端返回文件流和json格式的方式进行文件下载导出
    elasticsearch 安装
    docker-compose 命令
    艾孜尔江的部分影视作品
    游戏作品:万里同风
    Unity设置计时器
    Unity项目中VS Code部分功能出现问题解决思路
    Unity接收FFmpeg的UDP推流
    SVN Basics
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/3785965.html
Copyright © 2011-2022 走看看