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. css3波浪形loading动画

    css3做个第一个动画,主要点在box-shadow和background的变化,虽然不难,但是还是有一定的技巧性的!备注下 html <div class="loading" ...

  2. bootstrap简章

    系统整理一遍bootstrap 的东西 1/  设置页面为H5文档类型 <!DOCTYPE html> <html lang="zh-CN"> ... &l ...

  3. 用python发送GET和POST请求

    GET请求: python2.7: import urllib,urllib2 url='http://192.168.199.1:8000/mainsugar/loginGET/' textmod ...

  4. jacob 操作word转pdf

    项目需要对上传的word及pdf进行在线预览,因基于jquery的pdf插件,很方面实现在线预览,而word实现在线预览费劲不少,于是想到在进行上传处理时,直接将word转成pdf,在预览时直接预览p ...

  5. VB6.0 String 用法总结

    问题一 VB 去掉字符串的头尾的空格 使用trim() 如: trim(" hello world ")= "hello world" 问题二 判断一个字符串是 ...

  6. liunx下NetworkManager导致网卡不能启动

    前几天在客户现场,配置一台系统为redhat 6.0的服务器,这台服务器是IBM x3755,系统是预装的.在把服务器的IP地址配置完成后,使用命令不能启动网卡.提示:弹出界面 eht0:错误:激活链 ...

  7. LPC同STM32的比较

    Cortex-M3是新兴起来的一种ARM7的核,而ARM7TDMI是一种传统的经典的ARM内核.我们就抛开这一切,来比较一下两则的异同. 我们就在以下平台上比较吧: STMicoelectronics ...

  8. PHP自定义函数与字符串处理

    自定义函数:    1.默认值的函数:    function Main($a=5,$b=6)    {        echo $a*$b;    } 2.可变参数的函数:    function ...

  9. php的stdClass类

    在PHP内核进行模块初始化操作时会自动加载这个函数, 这样,stdClass类的注册操作也就会被执行了.stdClass类是一个没有成员变量也没有成员方法的类. 它的所有的魔术方法,父类.接口等在初始 ...

  10. LCP Array(思维)

    LCP Array Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...