最近的项目比较紧,写博客的时间基本都用来看文档和视频了,很感谢老大给了这么多时间让我研究,好几种方案都被我给毙了,因为有要兼顾其他模块,视频聊天的P2P模式也在silverlight下搞不了,看了唯一的一个例子居然还是基于LiveMessage的,silverlight快点支持P2P吧!!目前在数据传递方面基本确定了用WCF来搞定一切,包括聊天,视频和文件传递,不过不能再采用HTTP协议了,改用net.tcp来做,直接host到控制台,试了试IIS,但是比较复杂,明天再调试一下将wcf服务host到IIS上。有兄弟说WCF在文件传递方面不太理想,先出了原型了,后期尽量还是往SOCKET方面靠拢。
先说今天的demo,由于我基本还是逐步进行代码转移的,先做了将服务寄宿到console,并且直接使用console来做客户端的方式。
服务端的代码都简单写到一个文件中了,还是以前的几个方法,发信息与收信息
{
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中
实体类
public class MessageInfo
{
[DataMember]
public string Message { set ; get ; }
[DataMember]
public string UserName { set ; get ; }
[DataMember]
public string PartnerName { set ; get ; }
}
简单写了个host类,这里需要指定服务采用的绑定方式和地址以及接口等信息
代码
{
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;
}
}
主方法
{
static void Main( string [] args)
{
MyHost.Open();
System.Console.WriteLine( " 服务已经启动... 敲任意键停止服务 " );
System.Console.ReadLine();
MyHost.Close();
}
}
那么客户端呢,假定leon和mac对话,发送了一条信息给mac,然后模拟mac去取了这条信息显示出来。
{
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,如需转载请自行联系原作者