客户端如何更具需要连接不同的服务端

当我们写客户端《--------》服务端的时候,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 "付长梦";
        }
    }
}

第二步:在客户端我们新建两个接口文件IService、IMyName(我采用的是服务端就是服务端,客户端是客户端,分为两个解决方案)

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();
    }
}

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; }
    }
}

第三步:客户端的按钮实现功能

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);
        }

第四步:开启服务端,将服务端分布在服务器和本地测试一下,结果如图

本地服务端运行截图

服务端运行截图

客户端运行截图

时间: 2024-10-02 20:55:53

客户端如何更具需要连接不同的服务端的相关文章

一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断?

我们有2台内部http服务(nginx): 201:这台服务器部署的服务是account.api.91160.com,这个服务是供前端页面调用: 202:这台服务器部署的服务是hdbs.api.91160.com,    这个服务是供前端页面调用: 近期发现,这2台服务器的网络连接中,TIME_WAIT 数量差别很大,201的TIME_WAIT大概20000+,202的TIME_WAIT大概1000 ,差距20倍:2台的请求量差不多,都是以上内部调用的连接,且服务模式也没有什么差异,为什么连接数

关于NFS客户端挂载成功但不显示NFS服务端挂载目录下的文件的处理办法及问题还原。

一.问题原因 1.1NFS客户端某个目录虽然挂载成功NFS服务端的目录,但是NFS客户端挂载目录里并不显示NFS服务端目录下的内容. 1.2NFS客户端某个目录虽然卸载成功NFS服务端的目录,但是NFS客户端挂载目录里依然显示NFS服务端目录下的内容. 二.问题结论 在NFS客户端挂载/卸载NFS服务端目录的时候一定要事先退出挂载目录!挂载/卸载目录之后,再进入挂载目录查看结果! 三.问题展现 3.1测试服务器基本配置 #提供一台NFS客户端,一台NFS服务端.下述不提供NFS安装教程. #两台

java的客户端可以连接CPlus的服务端

今天做的实验,用c++做的服务端,端口号为6000:用java做的客户端,IP为127.0.0.1,port为6000,结果双方可以连接上线: 贴代码: 服务端: #include <winsock2.h>#include <iostream>using namespace std;SOCKET sockConn = NULL;char content[100] = " ";int flag = 1;DWORD WINAPI MYrevc(LPVOID lp){

TCP客户端频繁连接退出,服务端避免内存的重复开辟

防止内存的重复开辟:Free 而不 Destory 参数说明: lpFreeSocketList:服务端数据结构中保存的退出的客户对象链表头 lpSocketListCs:临界区指针 s:SOCKET对象 LPSOCKET_OBJ GetSocketObj(LPSOCKET_OBJ * lpFreeSocketList, CRITICAL_SECTION * lpSocketListCs, SOCKET s){ LPSOCKET_OBJ lpSockObj = NULL; EnterCritic

openvpn连接后与服务端内网服务器连接

客户端连接vpn服务端后会获取一个10.8.0.x的地址,而openvpn服务器上面有一个10.8.0.1的地址,此时客户端就能连接服务端了.如果配置文件内没有配置"push "route xx.xx.oo.oo 255.255.255.0""这条,客户端不能通过服务器内网连接服务器,在配置文件中添加此条文件即可.xx.xx.oo.oo为服务器内网网段. 如果想要和同在一个网段的其他服务器通信,有三种方法.1.在需要访问的服务器上面添加一条到10.8.0.0的静态路

我的世界连接不上服务端

创建了一个我的世界服务端,在客户端可以搜到服务器 但是怎么都进不去自己的服,连接时会失败,服务端提示 Server permissions file permissions.yml is empty..... [18:49:35] [Server thread/INFO]: [email protected][id=<null>,name=tony,properties={},legacy=false] (/ipipip) lost connection:Disconnected 需要把服务端

MFC ADO连接Oracle12c数据库 服务端配置

要想客户端访问服务器端的oracle数据库的话,还需要服务端设置下监听程序及本地网络服务名配置. 发现百度文库上面有这方面的文档,我就不重复写了.请参照一下网址: http://wenku.baidu.com/link?url=tCe-EbJNYwd0AmJ3NpTgh1AfzH6ZbV5IPHDUtNeeko5f-bThqoA1oCshT9ij8dihKRtgj2Y5KTnMITSr5Sh9ksVIv3F4qWCarNPE0_QfGUi

android客户端利用sokcet通信和向Java服务端发请求,Java服务端把文件发给android客户端

Java服务端 package com.yqq.socketTest; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

Tcp服务端判断客户端是否断开连接

今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链接的时候才能成功链接. 然后就开始找各种方法.其中简单的是看recv()返回为0,表明断开了链接,但是recv函数始终返回SOCKET_ERROR,找不到原因............ 参考的方法: 下面来罗列一下判断远端已经断开的方法: 法一: 当recv()返回值小于等于0时,socket连接断开