SilverLight搭建WCF聊天室详细过程(八)发送文本消息
时间:2010-12-26 来源:fugitiver
上一节为大家演示了如何添加到自定义任务栏来模仿windows界面,这节我们就开始聊天室的中心功能,发送文本消息,先看流程图:
流程比较简单,客户端获取RichTextBox消息后通过WCF接口调用服务端message()函数,这个不多讲,重要的讲下思路,先给大家关键代码:

private void rtbSendContent_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
sendTextMessage();
}
}
//发送文本消息,主要传递richtextbox里的xaml,为了简化把不必要的xaml删掉
string sendXaml = "";
private void btSend_Click(object sender, RoutedEventArgs e)
{
sendTextMessage();
}
//发送文本消息
private void sendTextMessage()
{
//判断消息是否为空
if (rtbSendContent.Xaml != "" & rtbSendContent.Xaml.Contains("</Paragraph>"))
{
//要发送的内容
sendXaml = rtbSendContent.Xaml.Substring(rtbSendContent.Xaml.IndexOf(">") + 1, rtbSendContent.Xaml.IndexOf("</Section>") - rtbSendContent.Xaml.IndexOf(">") - 1);
operation.prox.messageAsync(tbChatName.Text.ToString(), sendXaml);//发送文本消息
rtbSendContent.Blocks.Clear();//清空富文本框
}
}
sendTextMessage()函数为消息处理,rtbSendContent.Xaml为获取RichTextBox的Xaml代码,我们先看下获取到的Xaml代码:

这段代码是我断点后获得的,有人可能会问获得它有什么必要,我给出几点解释和我的思路:
1.RichTextBox不能序列化成二进制,也许在WPF中可以,但是SL中不行,所以我们只能传送获取到的Xaml。
2.RichTextBox在插入一张图片后获取xaml代码是不能获取到这张图片的xaml的,也就是说xaml代码中找不到图片信息,所以也就不能图片,文字一起发送
3.有人可能说了,我直接发送整个获取道德xaml代码,例如上边的代码,然后在对方接收时把这段xaml赋值给接收用的RichTextBox,这个思路可以,但是我上边提到了xaml中没有图片信息,考虑以下环境:我先给对方发送一张图片,对方可以显示出,我再发送一个文本消息,当把xaml赋值给接受的RichTextBox时将覆盖图片,图片就不能显示,而且每次都要发送整个聊天窗口中已存在的聊天内容,导致数据量很大。
4.我给出我的解决办法,大家可以观察这段xaml代码,都是以<Section>开头,以</Section>结尾,通过查看msdn有关RichTextBox介绍,我们发现发我们发送的文本消息其实是<Paragraph></Paragraph>里面的内容,也就是说<Section></Section>这个节点可以去掉,也就是把每段文字拆分成<Paragraph></Paragraph>几段这种节点发送,然后在接收时进行组装,接收显示内容我会在下一步进行讲解,这样发送的数据流大小压缩到最小,也不会影响显示。
5.还有一点就是按“回车”发送消息,这里定义一个rtbSendContent_KeyDown()事件,判断输入是不是“回车”,如果是就发送消息,但是我这里要提醒大家,一定要把RichTextBox的AcceptsReturn属性设置为False,这个属性表示是否按下回车后产生换行符,这个在发送消息时不需要,我在这里郁闷了很久,现在拿出来给大家做个备忘。
总结:其实发送消息和接受消息就是一个xaml拆分和组装的过程,大家要充分利用各种可以使用的资源,我总觉得把自己的思想转变成编程语言才是一个程序开发者该做的,发送和接收过程很多朋友都在问,在这里希望我阐述的对大家有所帮助。
谢谢大家每次的意见,这次讲解占了大部分,希望对新手入门带来帮助,如果各位朋友觉得有所帮助,希望大家点下推荐,你们的支持才是我更新博客的动力,谢谢大家。
本节代码和数据库下载