http://www.cnblogs.com/chengxingliang/archive/2012/05/24/2515100.html

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

<?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(943);
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, 0, 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(100);
}
} static void ServerThread()
{
//获取4525端口监听的Socket服务端
Socket socket = GetSocketServer(4525);
while (true)
{
Socket _socket = socket.Accept();
//服务步骤二:如果有客户端请求的连接,则发送消息告知客户端
byte[] b2 = new byte[1024];
_socket.Receive(b2);
Console.WriteLine(Encoding.UTF8.GetString(b2).Replace("\0", ""));
string recString = "我已经收到消息了";
_socket.Send(Encoding.UTF8.GetBytes(recString));
_socket.Close();
Thread.Sleep(100);
}
}
//根据端口建立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(40);
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, 0, 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", 4525);
//将需要发送的内容转为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, 0, userbytes.Length);
socket.SendAsync(e);
}
else if (e.LastOperation == SocketAsyncOperation.Send)
{
//客户端步骤三:消息发送成功,此时设置一个新的缓冲区实例,并且发起异步接收服务器返回的消息
byte[] userbytes = new byte[1024];
e.SetBuffer(userbytes, 0, userbytes.Length);
socket.ReceiveAsync(e);
}
else if (e.LastOperation == SocketAsyncOperation.Receive)
{
//客户端步骤四:获取到服务器返回的消息,关闭Socket
string RecevieStr = Encoding.UTF8.GetString(e.Buffer, 0, 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="23" HorizontalAlignment="Left" Margin="20,20,0,0"
Name="tbInput" VerticalAlignment="Top" Width="243" />
<Button Content="发 送" Height="23" HorizontalAlignment="Left"
Margin="279,20,0,0" Name="button1" VerticalAlignment="Top"
Width="75" Click="button1_Click" />
<sdk:Label Height="28" HorizontalAlignment="Left" Margin="20,57,0,0"
Name="lbShowMessage" VerticalAlignment="Top" Width="358" />
</Grid>

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

Silverlight下的Socket通讯的更多相关文章

  1. 在windows下用C语言写socket通讯实例

    原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #in ...

  2. 试解析Tomcat运行原理(一)--- socket通讯

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  3. Socket通讯

    复习贴,资料大多来自百科.看了一遍理解了一遍,把绕口的话按语义给改了`_>` 对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别.不管是Socket还是S ...

  4. Android笔记:Socket通讯常见问题

    经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2  如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...

  5. 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯

    前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...

  6. c#写个基础的Socket通讯

    晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...

  7. Protobuf实现Android Socket通讯开发教程

    本节为您介绍Protobuf实现Android Socket通讯开发教程,因此,我们需要先了理一下protobuf 是什么? Protocol buffers是一种编码方法构造的一种有效而可扩展的格式 ...

  8. 试解析Tomcat运行原理(一)--- socket通讯(转)

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  9. 关于socket通讯,如何才能高效?

    关于socket通讯,如何才能高效? 网络通讯,一个不朽的话题,今天和一个做游戏的朋友(以前的同事聊天),他向我诉说了他的痛苦 他之前是做客户端的,无奈人力资源紧张,也开始搞服务器,他说自己的服务器总 ...

随机推荐

  1. 多个DLL合并,DLL合并到EXE

    1:) 下载 http://download.microsoft.com/download/1/3/4/1347C99E-9DFB-4252-8F6D-A3129A069F79/ILMerge.msi ...

  2. Spring与Mybatis配置问题

    Spring和Mybatis的整合,主要借助于Spring的依赖注入和控制反转来简化Mybatis的配置,使用两个配置文件[注:此种配置文件网上已经有很多]: spring.xml: <?xml ...

  3. winform 拖动无边框窗体(调用Windows API)

    第一步:将窗体的FormBoderStyle属性设置为None: 第二步:添加一个新类:Win32.cs 代码如下: public class Win32 { [DllImport("use ...

  4. LED发光二极管

    半导体发光器件包括半导体发光二极管(简称LED).数码管.符号管.米字管及点阵式显示屏(简称矩阵管)等.事实上,数码管.符号管.米字管及矩阵管中的每个发光单元都是一个发光二极管. 一. 半导体发光二极 ...

  5. 提交(post)xml文件给指定url的2种方法

    原文:提交(post)xml文件给指定url的2种方法 1  这段代码是在网上搜到的,拿来共享,项目正好要用到.其中的data你只需要传递一个xml字符串就可以 protected   string  ...

  6. HttpContext.Current.Cache 过期时间

    原文:HttpContext.Current.Cache 过期时间 为了更快的读取数据,我们一般会把常用到的数据加载到Cache中 在.NET中,Cache的存在可以依赖多中方式,主要用到HttpCo ...

  7. Java - 字符串和Unicode互转 - 解析小米pm.min.js

    小米JS地址: http://p.www.xiaomi.com/zt/20130313/huodong/pm.min.js 上面这个JS是小米抢手机页面的代码.和抢手机有直接关联.. 虽然我3次都没抢 ...

  8. C语言入门(16)——C语言的数组

    和结构体类似,数组也是一种复合数据类型,它由一系列相同类型的元素组成.C语言支持一维数组和多维数组.如果一个数组的所有元素都不是数组,那么该数组称为一维数组. 一维数组的定义方式 在C语言中使用数组必 ...

  9. Android上运行本地c

    在android代码中编译一个可执行文件,主要功能是对文件的读写, 简单贴出来: #include <errno.h> #include <stdio.h> #include  ...

  10. Android 主线程和线程之间相互发送消息

    通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带L ...