在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 ThreadStart(ServerThread)); server.Start(); } 策略请求监听 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); } } voID ServerThread() { 获取4525端口监听的Socket服务端 Socket socket = GetSocketServer(4525); true) { Socket _socket = socket.Accept(); 服务步骤二:如果有客户端请求的连接,则发送消息告知客户端 byte[] b2 = byte[1024]; _socket.Receive(b2); Console.Writeline(EnCoding.UTF8.GetString(b2).Replace("string,0)">"")); 我已经收到消息了 recString = "100; _socket.Send(EnCoding.UTF8.GetBytes(recString)); _socket.Close(); Thread.Sleep(根据端口建立Socket服务器端); } } static int Socket GetSocketServer(new serverPort) { Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); socket.Bind(40 IPEndPoint(IPAddress.Any,serverPort)); socket.Listen(return); 获取安全策略文件的byte[] socket; } byte string[] GetPolicyToClIEnt() { \bin\DeBUG path = Environment.CurrentDirectory.Replace(""new); fileStream fs = @" fileStream(path+ \clIEntaccesspolicy.xmlintint length = (byte)fs.Length; byte[] bytes = return[length]; fs.Read(bytes,length); fs.Close(); bytes; } }public
B.其次我们来看客户端 *** 作,分为以下几个步骤:
客户端步骤一:发起服务器连接请求。
客户端步骤二:连接服务器成功,将需要发送的数据放入缓冲区中,然后异步向服务器发送消息请求
客户端步骤三:消息发送成功,此时设置一个新的缓冲区实例,并且发起异步接收服务器返回的消息
客户端步骤四:获取到服务器返回的消息,关闭Socket
客户端cs代码如下:
partial class public MainPage : UserControl { private MainPage() { InitializeComponent(); } System.Net.sockets.socket socket; voID object button1_Click(byte sender,RoutedEventArgs e) { this[] userbytes = EnCoding.UTF8.GetBytes(new.tbinput.Text); socket = new System.Net.sockets.socket(AddressFamily.InterNetwork,ProtocolType.Tcp); socketasynceventargs socketArgs = new socketasynceventargs(); socketArgs.RemoteEndPoint = 127.0.0.1 DnsEndPoint(将需要发送的内容转为byte[],保存到UserToken属性中new socketArgs.UserToken = userbytes; socketArgs.Completed += 客户端步骤一:发起服务器连接请求。 EventHandler<socketasynceventargs>(socketArgs_Completed); 每发生一个Socket *** 作都讲激活此方法, *** 作包括(Connect/Send/Receive/None) socket.ConnectAsync(socketArgs); } voID if socketArgs_Completed(客户端步骤二:连接服务器成功,将需要发送的数据放入缓冲区中,然后异步向服务器发送消息请求 (e.Lastoperation == SocketAsyncoperation.Connect) { byte byte[] userbytes = (else[])e.UserToken; e.SetBuffer(userbytes,userbytes.Length); socket.SendAsync(e); } if 客户端步骤三:消息发送成功,此时设置一个新的缓冲区实例,并且发起异步接收服务器返回的消息 (e.Lastoperation == SocketAsyncoperation.Send) { byte 1024[] userbytes = if]; e.SetBuffer(userbytes,userbytes.Length); socket.ReceiveAsync(e); } 客户端步骤四:获取到服务器返回的消息,关闭Socket (e.Lastoperation == SocketAsyncoperation.Receive) { string "" RecevIEStr = EnCoding.UTF8.GetString(e.Buffer,e.Buffer.Length).Replace(因为是异步Socket请求,所以需要使用UI线程更新lbShowMessage的显示效果); this new.lbShowMessage.dispatcher.BeginInvoke(更新UI DoThingDele(DoThing),RecevIEStr); socket.Close(); } } voID string DoThing(this arg) { this.lbShowMessage.Content = ->.lbShowMessage.Content + "声明的一个DoThing方法委托 + arg; } delegate voID string DoThingDele( arg); }客户端Xaml前台代码如下:
LayoutRoot<GrID x:name="White Background="True ShowGrIDlines="23> <TextBox Height="left HorizontalAlignment="20,20,0 margin="tbinput name="top VerticalAlignment="243 WIDth="发 送 /> <button Content="" Height=button1 margin=279,0)">" name="75 WIDth="button1_Click Click="28 /> <sdk:Label Height="lbShowMessage name=358" /> </GrID>
最后效果如下,如需源码请点击 SLSocket.zip 下载,本文演示的是最简单通讯效果:
总结
以上是内存溢出为你收集整理的Silverlight下的Socket通讯全部内容,希望文章能够帮你解决Silverlight下的Socket通讯所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)