在本文中,将探讨如何使用Eneter Messaging Framework来实现Silverlight应用程序与独立桌面应用程序之间的文本消息传输。Eneter Messaging Framework是一个免费的框架,可以通过下载,并且可以在找到开发者的在线帮助。
在Silverlight应用程序中使用TCP连接时,需要特别注意以下几点:
政策服务器是一个特殊服务,监听在端口943上。该服务接收'<policy-file-request/>
'请求,并响应策略文件,该文件指定了谁被允许进行通信。当Silverlight创建TCP连接时,它会自动使用此服务。它在端口943上发送请求,并期望策略文件。如果政策服务器不存在或策略文件的内容不允许通信,则不会创建TCP连接。
Eneter Messaging Framework封装了低级套接字通信,并为TCP通信提供了方便的API。它还为提供了政策服务器。因此,实现非常简单。以下是示例代码:
桌面应用程序负责启动政策服务器并接收消息。以下是完整的实现代码:
using System;
using Eneter.Messaging.EndPoints.StringMessages;
using Eneter.Messaging.MessagingSystems.MessagingSystemBase;
using Eneter.Messaging.MessagingSystems.TcpMessagingSystem;
namespace Receiver
{
class Program
{
static void Main(string[] args)
{
// 启动政策服务器,允许Silverlight通过TCP进行通信。
TcpPolicyServer aPolicyServer = new TcpPolicyServer();
aPolicyServer.StartPolicyServer();
// 创建字符串消息的接收器。
IStringMessagesFactory aStringMessageReceiverFactory = new StringMessagesFactory();
IStringMessageReceiver aStringMessageReceiver = aStringMessageReceiverFactory.CreateStringMessageReceiver();
aStringMessageReceiver.MessageReceived += StringMessageReceived;
// 创建TCP监听通道。
// 注意:Silverlight只支持端口范围4502-4532
IMessagingSystemFactory aTcpMessagingFactory = new TcpMessagingSystemFactory();
IInputChannel anInputChannel = aTcpMessagingFactory.CreateInputChannel("127.0.0.1:4502");
// 将输入通道附加到字符串消息接收器并开始监听。
Console.WriteLine("Receiver is listening.");
aStringMessageReceiver.AttachInputChannel(anInputChannel);
}
static void StringMessageReceived(object sender, StringMessageEventArgs e)
{
// 处理接收到的消息。
Console.WriteLine(e.Message);
}
}
}
using System.Windows;
using System.Windows.Controls;
using Eneter.Messaging.EndPoints.StringMessages;
using Eneter.Messaging.MessagingSystems.MessagingSystemBase;
using Eneter.Messaging.MessagingSystems.TcpMessagingSystem;
namespace SilverlightApplication
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
// 创建字符串消息的发送器。
IStringMessagesFactory aStringMessageReceiverFactory = new StringMessagesFactory();
myStringMessageSender = aStringMessageReceiverFactory.CreateStringMessageSender();
// 创建通过TCP发送的输出通道。
// 注意1:Silverlight只支持端口范围4502-4532
IMessagingSystemFactory aTcpMessagingFactory = new TcpMessagingSystemFactory();
IOutputChannel anOutputChannel = aTcpMessagingFactory.CreateOutputChannel("127.0.0.1:4502");
// 将输出通道附加到字符串消息发送器,以便通过TCP发送消息。
myStringMessageSender.AttachOutputChannel(anOutputChannel);
}
// 当按钮被点击时发送消息。
private void button1_Click(object sender, RoutedEventArgs e)
{
string aMessage = textBox1.Text;
myStringMessageSender.SendMessage(aMessage);
}
private IStringMessageSender myStringMessageSender;
}
}