客戶端如何更具須要鏈接不一樣的服務端

當咱們寫客戶端《--------》服務端的時候,AB服務端均可以作一樣的工做,經過右鍵添加服務引用的話,拂過作成分佈集羣的話,一兩個服務端無所謂,十個了你得添加十次,二十個你得添加二十次。那麼問題出現了,如何在客戶端動態的根據各個服務器鏈接數自動的負載均衡了。安全

第一步:服務端確定有服務文件,如圖服務器

 

代碼以下:負載均衡

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WCFService
{
    // 注意: 使用「重構」菜單上的「重命名」命令,能夠同時更改代碼和配置文件中的類名「Service」。
    public class Service : IService ,IMyName
    {
        public UpFileResult UpLoadFile(UpFile filedata)
        {

            UpFileResult result = new UpFileResult();

            string path = System.AppDomain.CurrentDomain.BaseDirectory + @"\service\";

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            byte[] buffer = new byte[filedata.FileSize];

            FileStream fs = new FileStream(path + filedata.FileName, FileMode.Create, FileAccess.Write);

            int count = 0;
            while ((count = filedata.FileStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                fs.Write(buffer, 0, count);
            }
            //清空緩衝區
            fs.Flush();
            //關閉流
            fs.Close();

            result.IsSuccess = true;

            return result;

        }

        //下載文件
        public DownFileResult DownLoadFile(DownFile filedata)
        {

            DownFileResult result = new DownFileResult();

            string path = System.AppDomain.CurrentDomain.BaseDirectory + @"\service\" + filedata.FileName;

            if (!File.Exists(path))
            {
                result.IsSuccess = false;
                result.FileSize = 0;
                result.Message = "服務器不存在此文件";
                result.FileStream = new MemoryStream();
                return result;
            }
            Stream ms = new MemoryStream();
            FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
            fs.CopyTo(ms);
            ms.Position = 0;  //重要,不爲0的話,客戶端讀取有問題
            result.IsSuccess = true;
            result.FileSize = ms.Length;
            result.FileStream = ms;

            fs.Flush();
            fs.Close();
            return result;
        }

        public string myname(string str_name)
        {
            return string.Format("個人名字是:{0}",str_name);
        }

        public string DoWork()
        {
            return "付長夢";
        }
    }
}
View Code

 

第二步:在客戶端咱們新建兩個接口文件IService、IMyName(我採用的是服務端就是服務端,客戶端是客戶端,分爲兩個解決方案)tcp

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace WCFdny
{
    // 注意: 使用「重構」菜單上的「重命名」命令,能夠同時更改代碼和配置文件中的接口名「IMyName」。
    [ServiceContract]
    public interface IMyName
    {
        [OperationContract]
        string DoWork();
    }
}
View Code

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace WCFdny
{
    // 注意: 使用「重構」菜單上的「重命名」命令,能夠同時更改代碼和配置文件中的接口名「IService」。
    [ServiceContract]
    public interface IService
    {
        //上傳文件
        [OperationContract]
        UpFileResult UpLoadFile(UpFile filestream);

        //下載文件
        [OperationContract]
        DownFileResult DownLoadFile(DownFile downfile);

        [OperationContract]
        string myname(string str_name);
    }
    [MessageContract]
    public class DownFile
    {
        [MessageHeader]
        public string FileName { get; set; }
    }

    [MessageContract]
    public class UpFileResult
    {
        [MessageHeader]
        public bool IsSuccess { get; set; }
        [MessageHeader]
        public string Message { get; set; }
    }

    [MessageContract]
    public class UpFile
    {
        [MessageHeader]
        public long FileSize { get; set; }
        [MessageHeader]
        public string FileName { get; set; }
        [MessageBodyMember]
        public Stream FileStream { get; set; }
    }

    [MessageContract]
    public class DownFileResult
    {
        [MessageHeader]
        public long FileSize { get; set; }
        [MessageHeader]
        public bool IsSuccess { get; set; }
        [MessageHeader]
        public string Message { get; set; }
        [MessageBodyMember]
        public Stream FileStream { get; set; }
    }
}
View Code

 

第三步:客戶端的按鈕實現功能ide

private void button1_Click(object sender, EventArgs e)
        {
            string aa = string.Empty;
            NetTcpBinding bind = new NetTcpBinding();//綁定方式
            bind.MaxBufferPoolSize = 2147483647;//最大緩衝
            bind.TransferMode = TransferMode.Streamed;//傳輸模式爲流式處理
            bind.MaxReceivedMessageSize = 2147483647;//定義了服務端接收Message的最大長度,防止文件過大
            bind.Security.Mode = SecurityMode.None;//安全模式設置爲不進行驗證;
            if (radioButton1.Checked)
            {
                EndpointAddress epAddr = new EndpointAddress("net.tcp://127.0.0.1:8081");//此處也能夠用IIS作服務
                IMyName proxy = ChannelFactory<IMyName>.CreateChannel(bind, epAddr);
                aa = "本地WCF" + proxy.DoWork();
            }
            if(radioButton2.Checked)
            {
                EndpointAddress epAddr = new EndpointAddress("net.tcp://120.25.160.17:8081");//此處也能夠用IIS作服務
                IMyName proxy = ChannelFactory<IMyName>.CreateChannel(bind, epAddr);
                aa = "服務器WCF" + proxy.DoWork();
            }
            MessageBox.Show(aa);
        }
View Code

 

第四步:開啓服務端,將服務端分佈在服務器和本地測試一下,結果如圖測試

 本地服務端運行截圖spa

服務端運行截圖3d

客戶端運行截圖code

相關文章
相關標籤/搜索