Error[8]: Undefined offset: 159, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

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

在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通讯所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Silverlight下的Socket通讯_app_内存溢出

Silverlight下的Socket通讯

Silverlight下的Socket通讯,第1张

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

在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通讯所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1017201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存