使用wcf的雙工模式做的一個控制台聊天app

來源:互聯網
上載者:User

標籤:class   blog   ext   get   使用   檔案   

//wcf 服務

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;using System.Text;namespace WcfService1{    // 注意: 使用“重構”菜單上的“重新命名”命令,可以同時更改代碼和設定檔中的介面名“IService1”。    [ServiceContract(CallbackContract = typeof(iMyclass))]    public interface IService1    {                 [OperationContract]        string  Send(string id,string pid, string str);        [OperationContract]        string Register(string id);        [OperationContract]        List<string> ALLhost();        }    [ServiceContract]    public interface iMyclass    {        [OperationContract(IsOneWay = true)]//回呼函數方法必須加IsOneWay=true        void Reciver(string str);    }     }

  

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;using System.Text;namespace WcfService1{    // 注意: 使用“重構”菜單上的“重新命名”命令,可以同時更改代碼、svc 和設定檔中的類名“Service1”。    public class Service1 : IService1    {        public static Dictionary<string, iMyclass> hostdic;        public static List<string> allhost;        /// <summary>        ///         /// </summary>        /// <param name="id">發送人</param>        /// <param name="pid">接受人</param>        /// <param name="str">內容</param>        /// <returns></returns>        public string Send(string id,string pid, string str)        {            try            {                               foreach (var d in hostdic)                {                    if (d.Key == pid)                    {                        d.Value.Reciver(id+"發送:"+str);                    }                }             //iMyclass myclass= OperationContext.Current.GetCallbackChannel<iMyclass>();             //myclass.Reciver("你好");                return "1";            }            catch (Exception ex)            {                return ex.Message;            }        }        public List<string> ALLhost()        {            return allhost;        }        public string Register(string id)        {            if (hostdic == null)            {                hostdic = new Dictionary<string, iMyclass>();            }            if (allhost == null)            {                allhost = new List<string>();            }                            iMyclass imyclass = OperationContext.Current.GetCallbackChannel<iMyclass>();                hostdic.Add(id, imyclass);                allhost.Add(id);                        return id;        }        }}

  //宿主

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace ServerHost{    class Program    {        static void Main(string[] args)        {            ServiceHost serverhost = new ServiceHost(typeof(WcfService1.Service1));            serverhost.Open();            Console.WriteLine("open");            Console.ReadKey();        }    }}

  //宿主設定檔

<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><services><service name="WcfService1.Service1"><endpoint address="net.tcp://192.168.1.12:3721/calculatorservice"
//改為本地的ip
binding="netTcpBinding" contract="WcfService1.IService1" bindingConfiguration ="TicketBindingConfiguration"/> </service> </services> <bindings> <netTcpBinding> <binding name="TicketBindingConfiguration" openTimeout="00:10:10" receiveTimeout="00:10:10" sendTimeout="00:10:10" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> <security mode="None" /> <readerQuotas maxStringContentLength="6553600" maxArrayLength="6553600" /> </binding> </netTcpBinding> </bindings> </system.serviceModel> </configuration>

  //用戶端

using System;using System.Collections.Generic;using System.Linq;using System.Text;using WcfService1;using System.ServiceModel;using System.Configuration;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            try            {                myclass myclass = new myclass();                //  myclass.contentevent += receive;                InstanceContext callback = new InstanceContext(myclass);                //  ChannelFactory<IService1> channl = new ChannelFactory<IService1>(  "wcfserver");  如果不是雙工模式沒有回調的話就使用這個                DuplexChannelFactory<IService1> channl = new DuplexChannelFactory<IService1>(callback, "wcfserver");                IService1 IService1 = channl.CreateChannel();                Console.WriteLine("請輸入自己的使用者名稱");                string id = Console.ReadLine();                string str = IService1.Register(id.Trim());                Console.WriteLine(str);                while (true)                {                    Console.WriteLine("輸入發送資料");                    string info = Console.ReadLine();                    Console.WriteLine("輸入接受人");                    string piduser = Console.ReadLine();                    Console.WriteLine("發送給" + piduser.Trim() + ":" + info.Trim());                    IService1.Send(id,piduser.Trim(), info.Trim());                }                            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);                Console.ReadKey();            }        }    }    public class myclass : iMyclass    {        // public delegate void conten(string str);        //  public event conten contentevent;        public void Reciver(string str)        {            Console.WriteLine("{0}:" + str, System.DateTime.Now);            // contentevent(str);        }    }}

  //用戶端設定檔

<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><client><endpoint name="wcfserver" address="net.tcp://192.168.1.12:3721/calculatorservice" //改為本地的ip  binding="netTcpBinding"  contract="WcfService1.IService1"bindingConfiguration ="TicketBindingConfiguration"/></client><bindings><netTcpBinding><binding  name="TicketBindingConfiguration"  openTimeout="00:10:10" receiveTimeout="00:10:10"    sendTimeout="00:10:10"  maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"><security mode="None" /><readerQuotas  maxStringContentLength="6553600" maxArrayLength="6553600" /></binding></netTcpBinding></bindings></system.serviceModel></configuration>

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.