首页 > 其他分享 >WCF通讯实现

WCF通讯实现

时间:2024-10-16 10:23:19浏览次数:5  
标签:通讯 Console 实现 void int host WCF new public

1.服务端实现:

一.创建接口,并附加ServiceContract特性,并添加回调接口

namespace SOA.WCF.Interface
{
    [ServiceContract(CallbackContract =typeof(ICallBack))]
    public interface ICalculatorService
    {
        [OperationContract(IsOneWay =true)]
        void Plus(int x, int y);
    }
}
namespace SOA.WCF.Interface
{
    /// <summary>
    /// 不需要协议  是一个约束,由客户端实现
    /// </summary>
    public interface ICallBack
    {
        [OperationContract(IsOneWay =true)]
        void Show(int m,int n,int result);
    }
}

二.实现接口;

namespace SOA.WCF.Service
{
    public class CalculatorService : ICalculatorService
    {
        public void Plus(int x, int y)
        {
            //return x + y;
            int result = x + y;

            ICallBack callBack = OperationContext.Current.GetCallbackChannel<ICallBack>();
            callBack.Show(x,y,result);
        }
    }
}

三.配置config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <system.serviceModel>
        <!--<behaviors>
            <serviceBehaviors>
                <behavior name="MathServicebehavior">
                    <serviceDebug httpHelpPageEnabled="false"/>
                    <serviceMetadata httpGetEnabled="false"/>
                    <serviceTimeouts transactionTimeout="00:10:00"/>
                    <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <basicHttpBinding>
                <binding name="httpbinding"/>
            </basicHttpBinding>
        </bindings>
        <services>
            <service name ="SOA.WCF.Service.MathService" behaviorConfiguration="MathServicebehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:11113/MathService"/>
                        
                    </baseAddresses>
                </host>
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpbinding" contract="SOA.WCF.Interface.IMathService"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>-->


        <!--<behaviors>
            <serviceBehaviors>
                <behavior name="MathServicebehavior">
                    <serviceDebug httpHelpPageEnabled="false"/>
                    <serviceMetadata httpGetEnabled="false"/>
                    <serviceTimeouts transactionTimeout="00:10:00"/>
                    <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>

        <bindings>
            <netTcpBinding>
                <binding name="tcpbinding">
                    <security mode="None">
                        <transport clientCredentialType="None" protectionLevel="None"/>
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>

        <services>
            <service name ="SOA.WCF.Service.MathService" behaviorConfiguration="MathServicebehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:1111/MathService"/>
                    </baseAddresses>
                </host>
                <endpoint address="" binding="netTcpBinding" bindingConfiguration="tcpbinding" contract="SOA.WCF.Interface.IMathService"/>
                <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
            </service>
        </services>-->

        <behaviors>
            <serviceBehaviors>
                <behavior name="MathServicebehavior">
                    <serviceDebug httpHelpPageEnabled="false"/>
                    <serviceMetadata httpGetEnabled="false"/>
                    <serviceTimeouts transactionTimeout="00:10:00"/>
                    <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>
                </behavior>

                <behavior name="CalculatorServicebehavior">
                    <serviceDebug httpHelpPageEnabled="false"/>
                    <serviceMetadata httpGetEnabled="false"/>
                    <serviceTimeouts transactionTimeout="00:10:00"/>
                    <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>

        <bindings>
            <netTcpBinding>
                <binding name="tcpbinding">
                    <security mode="None">
                        <transport clientCredentialType="None" protectionLevel="None"/>
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>

        <services>
            <service name ="SOA.WCF.Service.MathService" behaviorConfiguration="MathServicebehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:1111/MathService"/>
                    </baseAddresses>
                </host>
                <endpoint address="" binding="netTcpBinding" bindingConfiguration="tcpbinding" contract="SOA.WCF.Interface.IMathService"/>
                <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
            </service>

            <service name ="SOA.WCF.Service.CalculatorService" behaviorConfiguration="CalculatorServicebehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:1111/CalculatorService"/>
                    </baseAddresses>
                </host>
                <endpoint address="" binding="netTcpBinding" bindingConfiguration="tcpbinding" contract="SOA.WCF.Interface.ICalculatorService"/>
                <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
            </service>
        </services>

    </system.serviceModel>
</configuration>

4.启动服务:

 public static void Process()
        {
            List<ServiceHost> hosts = new List<ServiceHost>()
            {
                new ServiceHost(typeof(MathService)),
                new ServiceHost(typeof(CalculatorService))
            };

            foreach (var host in hosts)
            {
                host.Opening += (s, e) => Console.WriteLine($"{host.GetType().Name} 打开");
                host.Open();
            }

            Console.WriteLine("输入任何字符,就停止");
            Console.Read();
            foreach (var host in hosts)
            {
                host.Close();
            }
            Console.Read();
}

5.客户端调用如下:

一.添加服务引用:

二.进行调用

namespace SOA.ConsoleTestProject
{
    class Program
    {
        static void Main(string[] args)
        {
            CallBackWCFTest.CalculatorServiceClient client = null;
            try
            {
                Console.WriteLine("This is test project");
                InstanceContext context = new InstanceContext(new CallBackService());
                client = new CallBackWCFTest.CalculatorServiceClient(context);
                client.Plus(1, 2);
                client.Close();
                Console.Read();
            }
            catch(Exception ex)
            {
                if(client != null)
                {
                    client.Abort();
                }
                Console.WriteLine(ex.Message);
            }
        }
    }

回调方法实现

namespace SOA.ConsoleTestProject
{
    class CallBackService : CallBackWCFTest.ICalculatorServiceCallback
    {
        public void Show(int m, int n, int result)
        {
            Console.WriteLine($"回调:{m}+{n}={result}");
        }
    }
}

当在服务端进行Show方法的调用时,客户端会进入show方法中执行,这样一来,就实现了服务端发消息给客户端;

 

标签:通讯,Console,实现,void,int,host,WCF,new,public
From: https://www.cnblogs.com/guoxu486/p/18469264

相关文章

  • java计算机毕业设计共享电动车电池管理系统设计与实现(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着城市交通的日益拥堵以及人们对环保出行方式需求的增长,共享电动车逐渐成为城市交通体系中的重要组成部分。共享电动车的普及带来了便捷,但同时......
  • 【开题报告】基于Springboot+vue猫咪交流平台的设计与实现(程序+源码+论文) 计算机毕业
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着宠物文化的兴起,猫咪作为家庭宠物的地位日益显著,越来越多的家庭选择猫咪作为生活的伴侣。然而,猫咪与人类之间存在天然的沟通障碍,猫咪无法用人类的......
  • 【含开题报告+文档+PPT+源码】音乐播放和推荐系统的设计与实现
    开题报告随着互联网的发展和智能设备的普及,人们对于音乐的需求越来越大。传统的音乐播放器已经无法满足人们多样化的需求,因此开发一个在线音乐推荐与播放平台具有重要的研究背景和实际意义。传统的音乐播放器只提供基本的音乐播放功能,无法根据用户的个性化需求进行音乐推荐。......
  • 【开题报告】基于Springboot+vue储酒与交易系统设计与实现(程序+源码+论文) 计算机毕业
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和消费观念的转变,酒类消费逐渐成为日常生活和社交活动中的重要组成部分。传统的酒类销售模式往往存在信息不对称、交易效率低......
  • python 实现旋转图片算法
    旋转图片算法介绍旋转图片算法是图像处理中常用的一种技术,它可以将图像中的对象旋转到特定的角度。这种算法在图像处理、计算机视觉、人工智能等领域都有广泛的应用,例如自动驾驶、医学影像、安防监控等场景。以下是旋转图片算法的基本步骤:确定旋转中心点:旋转操作通常围绕......
  • 实现Linux to go !ubuntu装入移动硬盘,实现在不同电脑运行。
    一.准备一个u盘制作启动盘1.下载ubuntu镜像文件Ubuntu20.04.6LTS(FocalFossa)2.使用Rufus制作Ubuntu启动盘        下载Rufus-轻松创建USB启动盘   注意此操作会清空u盘!二.移动硬盘磁盘分区1.下载DiskGenius软件,选中自己的移动硬盘2.选......
  • 基于nodejs+vue基于SpringBoot的美食分享系统的设计与实现[开题+源码+程序+论文]计算
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展,人们的生活方式发生了巨大变化,尤其是在美食领域。美食分享平台作为一种新兴的网络应用,受到了广大用户的青睐。基于SpringBoot的美......
  • c++如何使用pthread_join函数配合pthread_create函数来创建和等待线程完成,实现线程同
    在C++中,pthread_create 和 pthread_join 是POSIX线程库(pthread)的一部分,用于创建和管理线程。pthread_create 用于创建一个新的线程,而 pthread_join 用于等待一个线程的执行完成,从而实现线程同步与控制。基本步骤使用 pthread_create 函数创建一个线程。线程的工作由......
  • QT实现改变窗口大小其子控件也自动调节大小
    创建一个顶层布局即可,一定要在MainWindows或者Widget的下面! 观察图标变化带有禁止的意思是分拆布局(当前无布局)现在是添加布局后了 注意:一定是在MainWindows或Widget才可以添加顶层布局,才可以实现控件自适应现在我想实现的是文字跟随变化,效果图如下所以我们利用......
  • 基于keepalived实现负载均衡的高可用
    目录实验要求:实验过程:后端服务器负载均衡器1负载均衡器2安装keepalived宕机测试附加lb2的keepalived配置文件?什么是keepalived?HAproxy和Nginx的区别?Nginx可以完全取代Apache吗实验要求:1、实现负载均衡器的高可用,提升负载均衡器在面对高并发时的稳定性实验的延伸......