你的分享就是我们的动力 ---﹥

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

时间:2011-09-30 10:05来源:www.chengxuyuans.com 点击:

最近的项目比较紧,写博客的时间基本都用来看文档和视频了,很感谢老大给了这么多时间让我研究 ,好几种方案都被我给毙了,因为有要兼顾其他模块,视频聊天的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来建立长连接或者定 时不断的往服务器上发信息,聊天对方不停的去接收信息,但是这种方法怎么想都有点神经。。。

转载注明地址:http://www.chengxuyuans.com/slverlight/19416.html