InChatter系统之服务客户端的开发
今天终于开始客户端的开发了,客户端完成以后,我们将可以进行简单的交流。开发完成的程序只是一个很简单的雏形,在本系统完成以后,以及完成的过程中,大家都可以下载源码,在此基础上融入自己的想法和尝试,可以按照自己的思路,完成后面的部分。
下面我们开始客户端的开发,我们新建一个类库项目,作为与服务器端交互的中枢,同时也是为了分离服务和界面逻辑。目前我们将首先我们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系统之服务客户端的开发的更多相关文章
- InChatter系统之服务端的Windows服务寄宿方式(三)
为了部署的方便,我们开发Windows服务的服务寄宿程序,这样我们的服务便可以作为系统服务,随着系统的启动和关闭而启动和关闭,而避免了其他的设置,同时在服务的终止时(如系统关闭等)能及时处理服务的关闭 ...
- 超级好用的前端开发测试Chrome插件-基于REST的Web服务客户端
基于REST的Web服务客户端是一款功能强大的谷歌浏览器插件,使用基于REST的Web服务客户端(模拟REST客户端)可以让用户使用谷歌浏览器模拟REST请求来测试REST风格. 基于REST的Web ...
- InChatter系统之服务器开发(二)
现在我们继续进行InChatter系统的服务器端的开发,今天我们将实现服务契约同时完成宿主程序的开发,今天结束之后服务器端将可以正常运行起来. 系统的开发是随着博客一起的,颇有点现场直播的感觉,所有在 ...
- iOS推送小结(证书的生成、客户端的开发、服务端的开发)
1.推送过程简介 1.1.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请 ...
- InChatter系统之客户端实现原理与阶段小结
InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:Java集成应用中心。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- ctkPlugin插件系统实现项目插件式开发
插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...
随机推荐
- Java - split()函数和trim()函数的使用方法
split()函数和trim()函数的使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24465141 详细參考Java ...
- Codeforces 768 E. Game of Stones 博弈DP
E. Game of Stones Sam has been teaching Jon the Game of Stones to sharpen his mind and help him de ...
- spring boot redis缓存入门
摘要: 原创出处 泥瓦匠BYSocket 下载工程 springboot-learning-example ,工程代码注解很详细.JeffLi1993/springboot-learning-exam ...
- YTU 1099: Minesweeper
1099: Minesweeper 时间限制: 1 Sec 内存限制: 64 MB 提交: 180 解决: 98 题目描述 Minesweeper Have you ever played Min ...
- html5--项目实战-仿360囧图
html5--项目实战-仿360囧图 实例: 代码 <!doctype html> <html> <head> <meta charset="utf ...
- aliyun 日志服务(Log Service,Log)是针对日志场景的一站式服务
日志服务(Log Service,Log)是针对日志场景的一站式服务,在阿里巴巴集团内部被广泛使用.用户无需开发就能快捷完成日志生命周期中采集.消费.投递以及查询功能. 日志服务当前提供如下功能 日志 ...
- rsync+inotify 实现实时同步
inotify:这个可以监控文件系统中的添加,修改,删除,移动等事件 inotify的特性需要linux内核2.6.13以上的支持 [root@test1 inotify-tools-3.13]# u ...
- iOS开发,#define的使用
1.判断当前设备是不是iOS7以上版本 #define IOS_VERSION_7_OR_ABOVE (([[[UIDevice currentDevice] systemVersion] float ...
- linuxmint安装卡在探测文件系统,解决方法。
今天安装linuxmint17.3,一直卡在探测文件... 解决方法如下: 执行安装程序前,打开终端执行如下命令即可. sudo umount -l /isodevic
- 在Centos中yum安装和卸载软件的使用方法(转载)
转自: http://gzmaster.blog.51cto.com/299556/72278 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...