silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

  [索引页] [源码下载] 稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex servicE) 作者: webabcd 介绍 Silverlight 2.0 调用 WCF 的双向通信服务(Duplex servicE) 。开发一个服务端主动向客服端发送股票信息的程序,首先客户端先向服务端发送需要监控的股票的股票代码,然后服务端在该股信息发生变化的时候将信
  [索引页]
[源码下载]

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex servicE)

作者: webabcd
介绍
Silverlight 2.0 调用 WCF 的双向通信服务(Duplex servicE) 。开发一个服务端主动向客服端发送股票信息的程序,首先客户端先向服务端发送需要监控的股票的股票代码,然后服务端在该股信息发生变化的时候将信息推送到客户端。
    服务端:
        定义服务契约及回调接口
        从当前上下文获取回调的客户端信道
        需要的话则向客户端信道“推”消息
    客户端:
        构造 PollingDuplexhttpBinding 并在其上创建 IDuplexSessionChAnnel 的信道工厂
        异步方式打开信道工厂
        异步方式打开信道
        构造需要发送到服务端的消息 System.serviceModel.ChAnnels.message
        异步向服务端发送消息
        监听指定信道,用于异步方式接收服务端返回的消息
        不需要再接收服务端的消息则关闭信道
在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html  
示例 
服务端:
IDuplexservice.cs

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Collections.Generic;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Linq;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Runtime.serialization;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Text;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.ChAnnels;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// IDuplexservice - 双工(Duplex)服务契约

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// CallBACkContract - 双工(Duplex)服务的回调类型

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

[serviceContract(Namespace  =   " Silverlight20 " , CallBACkContract  =   typeof (IDuplexClient))]

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   interface  IDuplexservice

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// 客户端向服务端发送消息的方法

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <param NAME="receivedmessage">客户端向服务端发送的消息 System.serviceModel.ChAnnels.message</param>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    [OperationContract(IsOneWay = true)]

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
void SendStockCode(message receivedmessagE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// 双工(Duplex)服务的回调接口

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   interface  IDuplexClient

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// 客户端接收服务端发送过来的消息的方法

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <param NAME="returnmessage">服务端向客户端发送的消息 System.serviceModel.ChAnnels.message</param>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    [OperationContract(IsOneWay = true)]

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
void receiveStockmessage(message returnmessagE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


Duplexservice.cs

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Collections.Generic;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Linq;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Runtime.serialization;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Text;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.ChAnnels;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Threading;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.Activation;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.IO;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// Duplex 服务的服务端的实现

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// 本文以客户端向服务端提交股票代码,服务端定时向客户端发送股票信息为例

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   class  Duplexservice : IDuplexservice

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    IDuplexClient _client;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
bool _status = true;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// 客户端向服务端发送股票代码方法

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <param NAME="receivedmessage">包含股票代码的 System.serviceModel.ChAnnels.message </param>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    public void SendStockCode(message receivedmessagE)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 获取当前上下文的回调信道

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        _client = OperationContext.Current.GetCallBACkChAnnel<IDuplexClient>();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 如果发生错误则不再执行

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        OperationContext.Current.ChAnnel.Faulted += new EventHandler(delegate { _status = false; });

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 获取用户提交的股票代码

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        String stockCode = receivedmessage.GetBody<String>();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 每3秒向客户端发送一次股票信息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        while (_status)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 构造需要发送到客户端的 System.serviceModel.ChAnnels.message

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// Duplex 服务仅支持 Soap11 , Action 为请求的目的地(需要执行的某行为的路径)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            message stockmessage = message.Createmessage(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                messageVersion.soap11,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
"Silverlight20/IDuplexservice/ReceiveStockmessage",

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
String.Format("StockCode: {0}; StockPrice: {1}; CurrentTime: {2}",

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    stockCode,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
new random().Next(1200),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    datetiR_605_11845@e.Now.ToString()));

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
try

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 向客户端“推”数据

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                _client.ReceiveStockmessage(stockmessagE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
catch (Exception eX)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 出错则记日志

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                using (StreamWriter sw = new StreamWriter(@"C:\Silverlight_Duplex_Log.txt"true))

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    sw.Write(ex.ToString());

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    sw.WriteLine();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            System.Threading.Thread.Sleep(
3000);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

PollingDuplexserviceHostFactory.cs

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Collections.Generic;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Linq;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Web;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.ChAnnels;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.Activation;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/* 以下部分摘自文档 */

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

//  服务 svc 文件的 Factory 要指定为此类

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   class  PollingDuplexserviceHostFactory : serviceHostFactoryBase

@H_944_1382@

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
public override serviceHostBase CreateserviceHost(String constructorString,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        UrI[] baseAddresses)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
return new PollingDuplexSimplexserviceHost(baseAddresses);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

class  PollingDuplexSimplexserviceHost : serviceHost

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
public PollingDuplexSimplexserviceHost(params System.UrI[] addresses)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
base.InitializeDescription(typeof(DuplexservicE)new UrischeR_605_11845@eKeyedCollection(addresses));

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
protected override void InitializeRuntime()

@H_990_1555@

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 配置 WCF 服务与 Silverlight 客户端之间的 Duplex 通信

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// Silverlight 客户端定期轮询网络层上的服务,并检查回调信道上由服务端发送的所有新的消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 该服务会将回调信道上的由服务端发送的所有消息进行排队,并在客户端轮询服务时将这些消息传递到该客户端

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        PollingDuplexBindingElement pdbe 
= new PollingDuplexBindingElement()

@H_46_1618@

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// ServerPollTimeout - 轮询超时时间

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// InactivityTimeout - 服务端与客户端在此超时时间内无任何消息交换的情况下,服务会关闭其会话

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            ServerPollTimeout 
= TimeSpan.FromSeconds(3),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            inactivityTimeout 
= TimeSpan.Fromminutes(1)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }
;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 为服务契约(service contract)添加一个终结点(endpoint)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// Duplex 服务仅支持 Soap11

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        this.AddserviceEndpoint(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
typeof(IDuplexservicE),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
new CustomBinding(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                pdbe,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
new textmessageEncodingBindingElement(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    messageVersion.soap11,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    System.Text.Encoding.UTF8),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
new httpTransportBindingElement()),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
"");

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
base.InitializeRuntime();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


Duplexservice.svc

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

<% @H_616_1851@@ serviceHost Language="C#" Debugtrue serviceDuplexservice CodeBehind~/App_Code/Duplexservice.cs FactoryPollingDuplexserviceHostFactory  %>

大佬总结

以上是大佬教程为你收集整理的稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)全部内容,希望文章能够帮你解决稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。