silverlight
发布时间:2022-05-04 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
概述
[源码下载] 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAny
sourceMulticastClient 实现 ASM(Any
source Multicast),即“任意源多播” 作者: webabcd 介绍 Silverlight 4.0 对 UDP 协议的支持: UdpAny
sourceMulticastClient - 一个发送信息到多播
[源码下载]
稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的
支持: 通过 UdpAny
sourceMulticastClient 实现 ASM(Any
source Multicast),即“任意源多播”
作者:
webabcd
介绍
Silverlight 4.0 对 UDP 协议的
支持:
- UdpAnysourceMulticastClient - 一个发送信息到多播组并从任意源接收多播信息的客户端,即 ASM 客户端
在线DEMO
http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html
示例
演示如何通过 UdpAny
sourceMulticastClient 实现 ASM
1、服务端
Form1.cs
代码
//
启动多播的安全策略服务
private
void
LaunchMulticastPolicyServer()
{
/*
* Silverlight 程序加入多播组之前,会通过 UDP 端口 9430 发送初始消息到多播组,然后服务端返回相应的安全策略(详见文档)
* 为了方便下发安全策略,可以引用 Microsoft.Silverlight.PolicyServers.dll 程序集,其封装了相关的方法
*/
//
本例的安全策略配置结果为:授权通过 UDP 端口 3003 问多播组 224.0.0.1,授权通过 UDP 端口 3006 问多播组 224.0.0.1
MulticastPolicyConfiguration config
=
new
MulticastPolicyConfiguration();
config.AnysourceConfiguration.Add(
"
*
"
,
new
Multicastresource(Ipaddress.Parse(
"
224.0.0.1
"
),
3006
));
//
配置 ASM 的安全策略
MulticastPolicyServer server
=
new
MulticastPolicyServer(config);
server.Start();
Showmessage(
"
多播的安全策略服务已启动
"
);
}
2、客户端
UdpPacketEventArg
s.cs
代码
using
System;
using
System.Net;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Documents;
using
System.Windows.Ink;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Animation;
using
System.Windows.Shapes;
namespace
Silverlight40.Communication
{
public
class
UdpPacketEventArgs : EventArgs
{
//
UDP 包的内容
public
String
message {
get
;
set
; }
//
UDP 包的来源的 IPEndPoint
public
IPEndPoint source {
get
;
set
; }
public
UdpPacketEventArgs(
byte
[] data, IPEndPoint sourcE)
{
this
.message
=
System.Text.Encoding.UTF8.GetString(data,
0
, data.Length);
this
.source
=
source;
}
}
}
UdpAny
sourceMulticastCh
Anne
l.cs
代码
/*
* 通过 UdpAnysourceMulticastClient 实现 ASM(Any source Multicast),即“任意源多播”
* 多播组基于 IGMP(Internet Group Management Protocol),即“Internet组管理协议”
*
* UdpAnysourceMulticastClient - 一个发送信息到多播组并从任意源接收多播信息的客户端,即 ASM 客户端
* BeginJoinGroup(), EndJoinGroup() - 加入多播组的异步方法
* BeginReceiveFromGroup(), EndReceiveFromGroup() - 从多播组接收信息的异步方法(可以理解为接收多播组内所有成员发送的信息)
* BeginSendToGroup(), EndSendToGroup() - 发送信息到多播组的异步方法(可以理解为发送信息到多播组内的全部成员)
* receiveBufferSize - 接收信息的缓冲区大小
* SendBufferSize - 发送信息的缓冲区大小
*
* BeginSendTo(), EndSendTo() - 发送信息到指定目标的异步方法
* Blocksource() - 阻止指定源,以便不再接收该源发来的信息
* Unblocksource() - 取消阻止指定源
* MulticastLoopBACk - 发出的信息是否需要传给自己
*
* 本例为一个通过 UdpAnysourceMulticastClient 实现 ASM 客户端的帮助类
*/
using
System;
using
System.Net;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Documents;
using
System.Windows.Ink;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Animation;
using
System.Windows.Shapes;
using
System.Text;
using
System.Net.sockets;
namespace
Silverlight40.Communication
{
public
class
UdpAnysourceMulticastChAnnel : IDisposable
{
private
UdpAnysourceMulticastClient _client;
//
接收信息的缓冲区
private
byte
[] _buffer;
//
此客户端是否加入了多播组
private
bool
_isJoined;
///
<sumMary>
///
构造函数
///
</sumMary>
///
<param NAME="groupaddress">
多播组地址
</param>
///
<param NAME="port">
客户端端口
</param>
///
<param NAME="maxmessageSize">
接收信息的缓冲区大小
</param>
public
UdpAnysourceMulticastChAnnel(Ipaddress groupaddress,
int
port,
int
maxmessageSizE)
{
_buffer
=
new
byte
[maxmessageSize];
//
实例化 ASM 客户端,需要指定的参数为:多播组地址;客户端端口
_client
=
new
UdpAnysourceMulticastClient(groupaddress, port);
}
//
收到多播信息后触发的事件
public
event
EventHandler
<
UdpPacketEventArgs
>
received;
private
void
OnReceived(IPEndPoint source,
byte
[] data)
{
var handler
=
received;
if
(handler
!=
null
)
handler(
this
,
new
UdpPacketEventArgs(data, sourcE));
}
//
加入多播组后触发的事件
public
event
EventHandler opening;
private
void
Onopening()
{
var handler
=
opening;
if
(handler
!=
null
)
handler(
this
, EventArgs.Empty);
}
//
断开多播组后触发的事件
public
event
EventHandler Closing;
private
void
OnClosing()
{
var handler
=
Closing;
if
(handler
!=
null
)
handler(
this
, EventArgs.Empty);
}
///
<sumMary>
///
加入多播组
///
</sumMary>
public
void
open()
{
if
(
!
_isJoined)
{
_client.beginJoinGroup(
result
=>
{
_client.EndJoinGroup(result);
_isJoined
=
true
;
Deployment.Current.Dispatcher.beginInvoke(
()
=>
{
Onopening();
receive();
});
},
null
);
}
}
public
void
Close()
{
_isJoined
=
false
;
OnClosing();
Dispose();
}
///
<sumMary>
///
发送信息到多播组,即发送信息到多播组内的所有成员
///
</sumMary>
public
void
Send(
String
msg)
{
if
(_isJoined)
{
byte
[] data
=
Encoding.UTF8.GetBytes(msg);
_client.beginSendToGroup(data, data.Length,
result
=>
{
_client.EndSendToGroup(result);
},
null
);
}
}
///
<sumMary>
///
从多播组接收信息,即接收多播组内所有成员发送的信息
///
</sumMary>
private
void
receive()
{
if
(_isJoined)
{
array.Clear(_buffer, _buffer.Length);
_client.beginReceiveFromGroup(_buffer, _buffer.Length,
result
=>
{
IPEndPoint source;
_client.EndReceiveFromGroup(result,
out
sourcE);
Deployment.Current.Dispatcher.beginInvoke(
()
=>
{
OnReceived(source, _buffer);
receive();
});
},
null
);
}
}
public
void
Dispose()
{
if
(_client
!=
null
)
_client.Dispose();
}
}
}
UdpAny
sourceMulticastClientDemo.xaml
代码
<
navigation:Page
x:Class
="Silverlight40.Communication.UdpAnysourceMulticastClientDemo"
xmlns
="http://scheR_369_11845@as.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://scheR_369_11845@as.microsoft.com/winfx/2006/xaml"
xmlns:d
="http://scheR_369_11845@as.microsoft.com/expression/blend/2008"
xmlns:mc
="http://scheR_369_11845@as.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
title
="UdpAnysourceMulticastClientDemo Page"
>
<
Grid
x:Name
="LayoutRoot"
>
<
Grid.columnDeFinitions
>
<
columnDeFinition
Width
="80"
/>
<
columnDeFinition
Width
="*"
/>
<
columnDeFinition
Width
="60"
/>
</
Grid.columnDeFinitions
>
<
Grid.RowDeFinitions
>
<
RowDeFinition
Height
="*"
/>
<
RowDeFinition
Height
="40"
/>
</
Grid.RowDeFinitions
>
<
ListBox
Name
="lstAllMsg"
Grid.columnSpan
="3"
Margin
="6"
/>
<
TextBox
Name
="txtUserName"
Grid.Row
="1"
Grid.column
="0"
Margin
="6"
/>
<
TextBox
Name
="txtSendMsg"
Grid.Row
="1"
Grid.column
="1"
textwrapping
="Wrap"
Margin
="6"
KeyDown
="txtmsg_KeyDown"
/>
<
Button
Name
="btnSend"
Grid.Row
="1"
Grid.column
="2"
Margin
="6"
Content
="发送"
Click
="btnSend_Click"
/>
</
Grid
>
</
navigation:Page
>
UdpAny
sourceMulticastClientDemo.xam
l.cs
代码
/*
* 用于演示 ASM 的客户端
*/
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Net;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Documents;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Animation;
using
System.Windows.Shapes;
using
System.Windows.Navigation;
namespace
Silverlight40.Communication
{
public
partial
class
UdpAnysourceMulticastClientDemo : Page
{
private
UdpAnysourceMulticastChAnnel _chAnnel;
public
UdpAnysourceMulticastClientDemo()
{
initializeComponent();
}
protected
override
void
OnNavigatedTo(NavigationEventArgs E)
{
txtUserName.Text
=
"
匿名
"
+
new
random().Next(
1000
,
9999
).ToString();
_chAnnel
=
new
UdpAnysourceMulticastChAnnel(Ipaddress.Parse(
"
224.0.0.1
"
),
3006
,
2048
);
_chAnnel.opening
+=
new
EventHandler(_chAnnel_opening);
_chAnnel.Received
+=
new
EventHandler
<
UdpPacketEventArgs
>
(_chAnnel_Received);
_chAnnel.Closing
+=
new
EventHandler(_chAnnel_Closing);
Application.Current.Exit
+=
new
EventHandler(Current_Exit);
_chAnnel.open();
}
void
_chAnnel_opening(
object
sender, EventArgs E)
{
_chAnnel.Send(
String
.Format(
"
{0}: 进来了 - [{1}]
"
, txtUserName.Text, datetiR_369_11845@e.Now.ToString(
"
HH:mm:ss
"
)));
}
void
_chAnnel_Received(
object
sender, UdpPacketEventArgs E)
{
//
因为已经指定了接收信息的缓冲区大小是 2048 ,所以如果信息不够 2048 个字节的的话,空白处均为“\0”
String
message
=
String
.Format(
"
{0} - 来自:{1}
"
, e.message.TrimEnd(
'
\0
'
), e.source.ToString());
lstAllMsg.Items.Insert(
0
, messagE);
}
void
_chAnnel_Closing(
object
sender, EventArgs E)
{
_chAnnel.Send(
String
.Format(
"
{0}: 离开了 - [{1}]
"
, datetiR_369_11845@e.Now.ToString(
"
HH:mm:ss
"
)));
}
void
Current_Exit(
object
sender, EventArgs E)
{
_chAnnel.Dispose();
}
private
void
btnSend_Click(
object
sender, routedEventArgs E)
{
SendMsg();
}
private
void
txtmsg_KeyDown(
object
sender, KeyEventArgs E)
{
if
(e.Key
==
Key.Enter)
SendMsg();
}
private
void
SendMsg()
{
_chAnnel.Send(
String
.Format(
"
{0}: {1} - [{2}]
"
, txtSendMsg.Text, datetiR_369_11845@e.Now.ToString(
"
HH:mm:ss
"
)));
txtSendMsg.Text
=
""
;
}
}
}
OK
[源码下载]
大佬总结
以上是大佬教程为你收集整理的稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即全部内容,希望文章能够帮你解决稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。