Silverlight与WCF之间的通信(3)利用net.tcp绑定方式寄宿到到控制台交互数据

简介:

最近的项目比较紧,写博客的时间基本都用来看文档和视频了,很感谢老大给了这么多时间让我研究,好几种方案都被我给毙了,因为有要兼顾其他模块,视频聊天的P2P模式也在silverlight下搞不了,看了唯一的一个例子居然还是基于LiveMessage的,silverlight快点支持P2P吧!!目前在数据传递方面基本确定了用WCF来搞定一切,包括聊天,视频和文件传递,不过不能再采用HTTP协议了,改用net.tcp来做,直接host到控制台,试了试IIS,但是比较复杂,明天再调试一下将wcf服务host到IIS上。有兄弟说WCF在文件传递方面不太理想,先出了原型了,后期尽量还是往SOCKET方面靠拢。

先说今天的demo,由于我基本还是逐步进行代码转移的,先做了将服务寄宿到console,并且直接使用console来做客户端的方式。

   

服务端的代码都简单写到一个文件中了,还是以前的几个方法,发信息与收信息 

代码
public   class  ChatService:IChatService 
    { 
        
private   static  List < MessageInfo >  listMessages  =   new  List < MessageInfo > (); 
        
public   void  SendMessage(MessageInfo message) 
        { 
            listMessages.Add(message); 
        }
        
public  List < MessageInfo >  GetMessages( string  userName,  string  partnerName) 
        { 
            var list 
=  listMessages.Where(m => m.PartnerName == userName && m.UserName == partnerName).ToList(); 
            listMessages.RemoveAll(m 
=>  m.PartnerName  ==  userName  &&  m.UserName  ==  partnerName); 
            
return  list; 
        } 
    }
    [ServiceContract] 
    
public   interface  IChatService 
    { 
        [OperationContract] 
        
void  SendMessage(MessageInfo message);
        [OperationContract] 
        List
< MessageInfo >  GetMessages( string  userName, string  partnerName); 
    }

 客户端的数据都保存在List中 

private   static  List < MessageInfo >  listMessages  =   new  List < MessageInfo > (); 

实体类 

代码
[DataContract] 
    
public   class  MessageInfo 
    { 
        [DataMember] 
        
public   string  Message {  set get ; } 
        [DataMember] 
        
public   string  UserName {  set get ; } 
        [DataMember] 
        
public   string  PartnerName {  set get ; } 
    }

 

 简单写了个host类,这里需要指定服务采用的绑定方式和地址以及接口等信息

 代码

public   class  MyHost 
    { 
        
static  ServiceHost host  =   null
        
public   static   void  Open() 
        {           
            
string  strAddress  =   " net.tcp://localhost:2010/ChatService "
            host 
=   new  ServiceHost( typeof (ChatService), 
                        
new  Uri(strAddress));            
            host.AddServiceEndpoint(
typeof (IChatService), 
                GetBinding(), 
"" ); 
            host.Open(); 
        } 
        
public   static   void  Close() 
        { 
            
if  (host  !=   null   &&  host.State  ==  CommunicationState.Opened) 
            { 
                host.Close(); 
            } 
            host 
=   null
        } 
        
public   static  Binding GetBinding() // 这个方法可以供客户端调用,便于统一 
        { 
            NetTcpBinding binding 
=   new  NetTcpBinding(); 
            binding.TransferMode 
=  TransferMode.Streamed; 
            binding.MaxReceivedMessageSize 
=   int .MaxValue; 
            
return  binding; 
        } 
    }

主方法 

代码
public   class  Program 
    { 
        
static   void  Main( string [] args) 
        { 
            MyHost.Open(); 
            System.Console.WriteLine(
" 服务已经启动...   敲任意键停止服务 " ); 
            System.Console.ReadLine(); 
            MyHost.Close(); 
        } 
    }

 那么客户端呢,假定leon和mac对话,发送了一条信息给mac,然后模拟mac去取了这条信息显示出来。 

代码
class  Program 
    { 
        
static   void  Main( string [] args) 
        { 
            
string  strAddress  =   " net.tcp://localhost:2010/ChatService "
            ChannelFactory
< Service.IChatService >  factory  =   new  
                ChannelFactory
< Service.IChatService > (Service.MyHost.GetBinding(),  new  EndpointAddress(strAddress)); 
            Service.IChatService service 
=  factory.CreateChannel(); 
            service.SendMessage(
new  Service.MessageInfo() { Message = " 哈哈 " ,UserName = " leon " ,PartnerName = " mac "  });
            var list 
=  service.GetMessages( " mac " " leon " );
            Console.WriteLine(
" mac跑去取了消息 " + list[ 0 ].Message); 
            Console.Read(); 
        } 
    }

 

  

最近的考虑有几点,写下来记录一下

1,WCF可以利用VS自动建立的对象进行对象传递,与silverlight之间传递文本视频对象都没有问题,可以host到IIS或者console上,但是传递的效率相对比较低,如果host到console上,实际项目中使用部署和维护都有额外的工作。

2,socket做为聊天服务器的话,没有办法host到IIS中去,只能在console中或者应用程序上做,而且最重要的是socket传递数据如何对象化是个问题,比如传输视频,我可能需要在视频流的byte中加入视频的发送者和接收人来供服务器进行处理,视频流的组合也是问题,本来想利用socket来建立长连接或者定时不断的往服务器上发信息,聊天对方不停的去接收信息,但是这种方法怎么想都有点神经。。。






     本文转自wengyuli 51CTO博客,原文链接:http://blog.51cto.com/wengyuli/587232,如需转载请自行联系原作者





相关文章
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
309 5
|
消息中间件 存储 JSON
Net使用EasyNetQ简化与RabbitMQ的交互
EasyNetQ是专为.NET环境设计的RabbitMQ客户端API,简化了与RabbitMQ的交互过程。通过NuGet安装EasyNetQ,可轻松实现消息的发布与订阅,支持多种消息模式及高级特性。文中提供了详细的安装步骤、代码示例及基础知识介绍,帮助开发者快速上手。关注公众号“Net分享”获取更多技术文章。
629 1
Net使用EasyNetQ简化与RabbitMQ的交互
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
557 0
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
577 0
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
740 0
|
SQL JSON 前端开发
.NET+Ajax+ashx 实现Echarts图表动态交互
前言:   使用Echarts展示图表效果,在这里只做了四种案例:折线、柱状、圆形、雷达。当初是一位朋友用到Echarts展示数据,他没有太多时间弄,所以我就帮他搞出来,当初刚接触的时候也是一头雾水,不知道该怎么下手,网上类似的案例有也不多,并且不是自己想要的效果。
2066 0
|
开发者 开发工具 定位技术
|
XML 网络架构 数据格式