aaarticlea/png;base64,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" alt="" />

在Silverlight中进行通讯,只能使用4502-4534之间的端口进行数据传输,另外Silverlight客户端会自动向943端口的 服务器端发送一个“<policy-file-request/>”的语句请求,然后服务器端943端口回发以下文件以许可Socket通 讯。

clientaccesspolicy.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from>
<domain uri="*"/>
</allow-from>
<grant-to>
<socket-resource port="4502-4534" protocol="tcp"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

  A.现在我们首先来看服务器端的代码,主要分为策略响应步骤和服务响应步骤。

  策略步骤一:启动监听943端口是否有需要安全策略文件请求

  策略步骤二:如果客户端请求是<policy-file-request/>,则将安全策略文件作为bytes发送给客户端

  服务步骤一:启动服务器端,监听4525端口,是否有Socket对话请求

  服务步骤二:如果有客户端请求的连接,则发送消息告知客户端

  代码如下:

    class Program
{
static void Main(string[] args)
{
//策略步骤一:启动监听943端口是否有需要安全策略文件请求
Thread access = new Thread(new ThreadStart(accessThread));
access.Start(); //服务步骤一:启动服务器端,监听4525端口,是否有Socket对话请求
Thread server = new Thread(new ThreadStart(ServerThread));
server.Start();
}
//策略请求监听
static void accessThread()
{
//获取943端口监听的Socket服务端
Socket socket = GetSocketServer();
while (true)
{
Socket new_access = socket.Accept();
string clientPolicyString = "<policy-file-request/>";
byte[] requestbytes = new byte[clientPolicyString.Length];
new_access.Receive(requestbytes);
string requeststring = System.Text.Encoding.UTF8.GetString(requestbytes, , requestbytes.Length); if (requeststring == clientPolicyString)
{
//策略步骤二:如果客户端请求是<policy-file-request/>,则将安全策略文件作为bytes发送给客户端
byte[] accessbytes = GetPolicyToClient();
new_access.Send(accessbytes, accessbytes.Length, SocketFlags.None);
new_access.Close();
}
Thread.Sleep();
}
} static void ServerThread()
{
//获取4525端口监听的Socket服务端
Socket socket = GetSocketServer();
while (true)
{
Socket _socket = socket.Accept();
//服务步骤二:如果有客户端请求的连接,则发送消息告知客户端
byte[] b2 = new byte[];
_socket.Receive(b2);
Console.WriteLine(Encoding.UTF8.GetString(b2).Replace("\0", ""));
string recString = "我已经收到消息了";
_socket.Send(Encoding.UTF8.GetBytes(recString));
_socket.Close();
Thread.Sleep();
}
}
//根据端口建立Socket服务器端
static Socket GetSocketServer(int serverPort)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, serverPort));
socket.Listen();
return socket;
}
//获取安全策略文件的byte[]
static byte[] GetPolicyToClient()
{
string path = Environment.CurrentDirectory.Replace("\\bin\\Debug","");
FileStream fs = new FileStream(path+ @"\clientaccesspolicy.xml", FileMode.Open);
int length = (int)fs.Length;
byte[] bytes = new byte[length];
fs.Read(bytes, , length);
fs.Close();
return bytes;
} }

  B.其次我们来看客户端操作,分为以下几个步骤:

  客户端步骤一:发起服务器连接请求。

  客户端步骤二:连接服务器成功,将需要发送的数据放入缓冲区中,然后异步向服务器发送消息请求

  客户端步骤三:消息发送成功,此时设置一个新的缓冲区实例,并且发起异步接收服务器返回的消息

  客户端步骤四:获取到服务器返回的消息,关闭Socket 

  客户端cs代码如下:

    public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
System.Net.Sockets.Socket socket; private void button1_Click(object sender, RoutedEventArgs e)
{
byte[] userbytes = Encoding.UTF8.GetBytes(this.tbInput.Text);
socket = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs socketArgs = new SocketAsyncEventArgs();
socketArgs.RemoteEndPoint = new DnsEndPoint("127.0.0.1", );
//将需要发送的内容转为byte[],保存到UserToken属性中
socketArgs.UserToken = userbytes;
socketArgs.Completed += new EventHandler<SocketAsyncEventArgs>(socketArgs_Completed);
//客户端步骤一:发起服务器连接请求。
socket.ConnectAsync(socketArgs);
}
//每发生一个Socket操作都讲激活此方法,操作包括(Connect/Send/Receive/None)
void socketArgs_Completed(object sender, SocketAsyncEventArgs e)
{
if (e.LastOperation == SocketAsyncOperation.Connect)
{
//客户端步骤二:连接服务器成功,将需要发送的数据放入缓冲区中,然后异步向服务器发送消息请求
byte[] userbytes = (byte[])e.UserToken;
e.SetBuffer(userbytes, , userbytes.Length);
socket.SendAsync(e);
}
else if (e.LastOperation == SocketAsyncOperation.Send)
{
//客户端步骤三:消息发送成功,此时设置一个新的缓冲区实例,并且发起异步接收服务器返回的消息
byte[] userbytes = new byte[];
e.SetBuffer(userbytes, , userbytes.Length);
socket.ReceiveAsync(e);
}
else if (e.LastOperation == SocketAsyncOperation.Receive)
{
//客户端步骤四:获取到服务器返回的消息,关闭Socket
string RecevieStr = Encoding.UTF8.GetString(e.Buffer, , e.Buffer.Length).Replace("\0", "");
//因为是异步Socket请求,所以需要使用UI线程更新lbShowMessage的显示效果
this.lbShowMessage.Dispatcher.BeginInvoke(new DoThingDele(DoThing), RecevieStr);
socket.Close();
}
}
//更新UI
public void DoThing(string arg)
{
this.lbShowMessage.Content = this.lbShowMessage.Content + "->" + arg;
}
//声明的一个DoThing方法委托
public delegate void DoThingDele(string arg);
}

  客户端Xaml前台代码如下:

    <Grid x:Name="LayoutRoot" Background="White" ShowGridLines="True">
<TextBox Height="" HorizontalAlignment="Left" Margin="20,20,0,0"
Name="tbInput" VerticalAlignment="Top" Width="" />
<Button Content="发 送" Height="" HorizontalAlignment="Left"
Margin="279,20,0,0" Name="button1" VerticalAlignment="Top"
Width="" Click="button1_Click" />
<sdk:Label Height="" HorizontalAlignment="Left" Margin="20,57,0,0"
Name="lbShowMessage" VerticalAlignment="Top" Width="" />
</Grid>

  最后效果如下,如需源码请点击 SLSocket.zip 下载,本文演示的是最简单通讯效果:

Silverlight的Socket通信的更多相关文章

  1. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

  2. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  3. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  4. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  5. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  6. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  7. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  8. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  9. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

随机推荐

  1. Win8下在Vmware11中安装使用苹果系统OS X 10.10

    原文:Win8下在Vmware11中安装使用苹果系统OS X 10.10   近来因为需要做 iOS 的项目,所以需要多花一些时间看看敲敲代码.因为自己手头上并没有 Mac(过年为了闲的时候能玩玩游戏 ...

  2. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  3. 应届GIS硕士求职经验总结

    记录一下作为一个GIS应届毕业生在帝都找工作的历程吧,之后的经历可能丰富多彩,可能萎靡不振,但这一次走过来了就是这一次的.希望以史为鉴,各位客官也能有所收获. 定位 我们这一届的"烟酒生&q ...

  4. a++为啥不能用作左值

    原地址:http://wy892648414.blog.163.com/blog/static/212212135201378496591/ 1)首先说左值和右值的定义: 变量和文字常量都有存储区,并 ...

  5. 算法起步之动态规划LCS

    原文:算法起步之动态规划LCS 前一篇文章我们了解了什么是动态规划问题,这里我们再来看动态规划另一个经典问题,最长公共子序列问题(LCS),什么是子序列,我们定义:一个给定序列将其中的0个或者多个元素 ...

  6. jvm理论

    三大流行jvm sun HotSpot ibm j9 BEA JRockit Oracle 会基于HotSpot整合 JRockit. jvm运行时数据区 java虚拟机所管理的内存将会包括以下几个运 ...

  7. Kiwi Syslog server 日志服务器搭建

    Kiwi syslog server 是一款很不错的日志服务器软件,安装过程就不多说,Linux 服务器日志由于本身就是syslog的,所以不用转换,但是windows 系统的日志格式是event形式 ...

  8. SE 2014年4月3日

    一  OSPF协议都支持哪些特殊区域?每种特殊区域都有什么特点. OSPF协议支持的特殊区域主要有stub区域.totally stub区域以及nssa区域,其中stub区域一般出现在末梢网络,即它的 ...

  9. Python数据结构-序列

    shopList=['apple','orange','pen'] print(shopList) print(]) print(]) print(:])) print(])) 运行结果: ['app ...

  10. tomcat压缩优化和缓存策略

    tomcat压缩内容 tomcat的压缩优化就是将返回的html页面等内容经过压缩,压缩成gzip格式之后.发送给浏览器,浏览器在本地解压缩的过程. 对于页面量信息大或者带宽小的情况下用压缩方式还是蛮 ...