今天终于开始客户端的开发了,客户端完成以后,我们将可以进行简单的交流。开发完成的程序只是一个很简单的雏形,在本系统完成以后,以及完成的过程中,大家都可以下载源码,在此基础上融入自己的想法和尝试,可以按照自己的思路,完成后面的部分。

下面我们开始客户端的开发,我们新建一个类库项目,作为与服务器端交互的中枢,同时也是为了分离服务和界面逻辑。目前我们将首先我们WPF客户端开发,在稍后的时间,我们再进行Winform的开发。

1.新建类库项目,作为客户端与服务器端的交互中枢

2.在新项目上添加服务引用

3.在弹出的窗体中输入我们的服务地址(服务地址可以从服务器端获取到):net.tcp://localhost:1121/InChatter

发生错误:元数据包含无法解析的引用:“net.tcp://localhost:1121/InChatter"

为什么会这样,其实这个跟我们的服务器端有关,我们设置了绑定的地址,但是并没有设置元数据的地址,记得在上节我说过,我们的配置文件配置的tcp连接方式,是有问题的,其实就是这个。

解决这个问题的方法有两种:

(1)为服务添加元数据的地址,我们在NetTcpBinding的基础上修改,这个应该说是比较正统的方法,当然不是说另外一种方法不正确了,看个人习惯了。

首先修改我们的服务器端代码,注意行号4以及行号4,我们添加了新的Behaviour,第10行提供了元数据的获取路径和方式

             using (ServiceHost host = new ServiceHost(typeof(Chat)))
{
NetTcpBinding binding = new NetTcpBinding();
Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
binding.Security.Mode = SecurityMode.None;
//会话保持时间
binding.ReceiveTimeout = TimeSpan.FromHours();
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = false });
host.AddServiceEndpoint(typeof(IChat), binding, "net.tcp://localhost:1121/InChatter");
host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "net.tcp://localhost:1121/InChatter/Mex");
host.Opened += host_Opened;
try
{
host.Open(); }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Press 'exit' to exit!");
string enterStr = Console.ReadLine();
while (enterStr.ToLower() != "exit")
{
enterStr = Console.ReadLine();
}
}

代码方面有个问题就是第8行一定要在AddServiceEndPoint前面,否则会出下面的问题:

未处理InvalidOperationException:在服务InChatter.Service.Chat实现的协定列表中找不到协定名称“IMetadataExchange”。将ServiceMetadataBehaviour添加到配置文件或直接添加到ServiceHost,以启用对该协定的支持。

xml的配置方式如下:

  <system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="ChatServiceBinding" transactionFlow="true"/>
</netTcpBinding>
</bindings>
<services>
<service name="InChatter.Service.Chat" behaviorConfiguration="ChatBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:1121/InChatter" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="ChatServiceBinding" contract="InChatter.Service.IChat" />
<endpoint address="Mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ChatBehavior">
<serviceMetadata httpGetEnabled="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

(2)第二种方法就是使用http来定义我们元数据访问路径,其实也是前一节我们所采用的方式

            Uri baseUri = new Uri("http://localhost:1378/InChatter");
using (ServiceHost host = new ServiceHost(typeof(Chat), baseUri))
{
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.None;
//会话保持时间
binding.ReceiveTimeout = TimeSpan.FromHours();
host.AddServiceEndpoint(typeof(IChat), binding, "net.tcp://localhost:1121/InChatter");
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
host.Opened += host_Opened;
try
{
host.Open(); }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Press 'exit' to exit!");
string enterStr = Console.ReadLine();
while (enterStr.ToLower() != "exit")
{
enterStr = Console.ReadLine();
}
}

这里要注意,第1行以及第9行,而我们在添加服务引用的时候,自然需要使用http://localhost:1378/InChatter这个路径

4.确定服务的命名空间,就完成了服务的添加

我们明明的ChatServer,在生成以后,会在我们命名空间的基础上追加,如图所示。

源码提供给大家:下载源码到CodePlex下载最新版本

InChatter系统之服务客户端的开发的更多相关文章

  1. InChatter系统之服务端的Windows服务寄宿方式(三)

    为了部署的方便,我们开发Windows服务的服务寄宿程序,这样我们的服务便可以作为系统服务,随着系统的启动和关闭而启动和关闭,而避免了其他的设置,同时在服务的终止时(如系统关闭等)能及时处理服务的关闭 ...

  2. 超级好用的前端开发测试Chrome插件-基于REST的Web服务客户端

    基于REST的Web服务客户端是一款功能强大的谷歌浏览器插件,使用基于REST的Web服务客户端(模拟REST客户端)可以让用户使用谷歌浏览器模拟REST请求来测试REST风格. 基于REST的Web ...

  3. InChatter系统之服务器开发(二)

    现在我们继续进行InChatter系统的服务器端的开发,今天我们将实现服务契约同时完成宿主程序的开发,今天结束之后服务器端将可以正常运行起来. 系统的开发是随着博客一起的,颇有点现场直播的感觉,所有在 ...

  4. iOS推送小结(证书的生成、客户端的开发、服务端的开发)

    1.推送过程简介 1.1.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请 ...

  5. InChatter系统之客户端实现原理与阶段小结

    InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...

  6. Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  7. Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:Java集成应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

随机推荐

  1. oracle的日期蛋

    一切都是扯鸡巴蛋. 在网上查oracle的日期函数用法,得到一大堆语法,林林总总,都是扯鸡巴蛋,没能解决我的问题. 其实,我想写这么一条语句:查找某个日期(不含时分秒)产生或有关的记录.咋写? SQL ...

  2. extjs grid 列顺序紊乱问题

    这个问题描述类似 关于extjs表格列展示顺序问题 明明在columns定义好了,理应按照里面的顺序输出嘛,但偏不,原本应该列在第一位的,结果忽而在最后,忽而在中间,忽忽何所似,天地一狗屎. 在谷歌里 ...

  3. stl之vector的应用

    这里主要是对vector容器的一些常见应用的总结.至于vector的构造函数及初始化能够參考http://blog.csdn.net/lsh_2013/article/details/21191289 ...

  4. UVA11419 SAM I AM —— 最小点覆盖 + 输出覆盖点集

    题目链接:https://vjudge.net/problem/UVA-11419 题解: 1.二分图匹配之最小点覆盖.:把x坐标和y坐标看成是点, 图中的目标看成是边,所以最终的目的是求出用最少的点 ...

  5. BLE广播数据的抓包解析

    前言: 报文由数据字节组成同时是按比特传输的,这就免不了牵涉到字节序的问题. 对于各个字节的传输,总是从最低位开始传输.如0x80是按00000001发送的,0x01是按10000000发送的. 同时 ...

  6. 在 SharePoint 2013 中针对地理位置字段创建地图视图

    在 SharePoint 2013 中针对地理位置字段创建地图视图 了解如何通过在 SharePoint 2013 列表中使用地图视图来显示位置信息.您可以通过 SharePoint 用户界面 (UI ...

  7. MultipartResolver实现文件上传功能

    转自:https://www.jb51.net/article/142736.htm springMVC默认的解析器里面是没有加入对文件上传的解析的,,使用springmvc对文件上传的解析器来处理文 ...

  8. 520. Detect Capital(检测数组的大小写)

    Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...

  9. bzoj3550: [ONTAK2010]Vacation(单纯形法+线性规划)

    传送门 直接暴力把线性规划矩阵给打出来然后单纯形求解就行了 简单来说就是每个数记一个\(d_i\)表示选或不选,那么就是最大化\(\sum d_ic_i\),并满足一堆限制条件 然后不要忘记限制每个数 ...

  10. Windows服务使用log4net记录日志

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 比较流行的日志组件有以下四种,Topshelf都有相应的组件提供 log4net NL ...