flex与C# Socket通信

17 篇文章 0 订阅

Socket 通信没什么好说,一个服务端,多个客户端,很容易搭建环境,网上代码一大片,这里主要的问题是as进行socket通信,必须跨A域B域,这时问题出现了,flash player会阻止你跨域访问,这时,flash player会自动检查安全策略。

 

在Adobe Flash Player升级到9.0.124后,由于安全策略的更改,使得在socket或xmlsocket的应用里,原先如用http方式加载安全策略的手段不能继续使用了,类似此类应用必须使用xmlsocket:

 

flashplayer的安全策略检测过程如下:

1,首先检测目标服务器的843端口是否提供安全策略

2,如果843端口没有检测到策略,则检测actionscript是否使用了

Security.loadPolicyFile(xmlsocket:ip:端口)//使用其他特定端口提供安全策略

3,检测目标服务器目标端口是否提供安全策略

 

C#利用socket提供安全策略,我们可以通过多种方式实现,如Window应用窗台,控制台应用程序,或者打包成服务等等



下面以控制台为例子

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Net;  
  6. using System.Net.Sockets;  
  7. using System.Threading;  
  8. using System.Collections;   
  9. namespace serverSocket  
  10. {  
  11.     class Program  
  12.     {  
  13.         private Thread Beginthread, receivethread;  
  14.         private Socket serverSocket, ClientSocket;  
  15.         //主程序  
  16.         static void Main(string[] args)  
  17.         {  
  18.             Program program = new Program();  
  19.             IPEndPoint remotePoint = new IPEndPoint(IPAddress.Any, 843);// 可以尝试 Security.loadPolicyFile(xmlsocket:ip:端口),使用其他的端口  
  20.             program.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  21.             program.serverSocket.Bind(remotePoint);  
  22.             program.serverSocket.Listen(10);  
  23.             Console.WriteLine("Listening...");  
  24.             program.Beginthread = new Thread(new ThreadStart(program.BeginListen));  
  25.             program.Beginthread.Start();  
  26.         }  
  27.         //循环监听  
  28.         private void BeginListen()  
  29.         {  
  30.             while (true)  
  31.             {  
  32.                 ClientSocket = serverSocket.Accept();  
  33.                 receivethread = new Thread(new ThreadStart(receive));  
  34.                 receivethread.Start();  
  35.             }  
  36.         }  
  37.         //等待客户端请求 <policy-file-request/>  
  38.         private void receive()  
  39.         {  
  40.             IPEndPoint clienTep = (IPEndPoint)ClientSocket.RemoteEndPoint;  
  41.             int bytes = 0;  
  42.             while (true)  
  43.             {  
  44.                 Byte[] buffer = new Byte[24];  
  45.                 bytes = ClientSocket.Receive(buffer);  
  46.                 if (bytes > 0)  
  47.                 {  
  48.                     string clientCommand = Encoding.UTF8.GetString(buffer, 0, bytes);  
  49.                     String policy = "<cross-domain-policy><allow-access-from domain=/"*/" to-ports=/"1111/" /></cross-domain-policy>/0";  
  50.                     buffer = System.Text.Encoding.UTF8.GetBytes(policy.ToCharArray());  
  51.                     ClientSocket.Send(buffer, buffer.Length, 0);  
  52.                 }  
  53.                 else  
  54.                 {  
  55.                     break;  
  56.                 }  
  57.             }  
  58.             ClientSocket.Close();  
  59.             receivethread.Abort();  
  60.         }  
  61.     }  
  62. }   


as socket程序更简单如下



  1. package Socket  
  2. {  
  3.     import flash.events.Event;  
  4.     import flash.events.IOErrorEvent;  
  5.     import flash.events.ProgressEvent;  
  6.     import flash.net.Socket;  
  7.     import flash.utils.ByteArray;  
  8.       
  9.     public class SPSocket  
  10.     {  
  11.         /** 
  12.          * Socket 套接字 
  13.          */  
  14.         public var socket:Socket=new Socket();  
  15.         /** 
  16.          * 域名或者主机Ip 
  17.          */  
  18.         public var host:String="localhost";  
  19.         /** 
  20.          * 通讯端口 
  21.          */  
  22.         public var port:int=1111;  
  23.         /** 
  24.          * 接收数据的类型 
  25.          */  
  26.         public var RecieveDataType:String="";  
  27.         /** 
  28.          * 发送数据的类型 
  29.          */  
  30.         public var SendDataType:String="";  
  31.           
  32.         /** 
  33.          * 通讯状态 
  34.          */  
  35.         private var stateMap:Object;  
  36.         /** 
  37.          * 当前通讯状态 
  38.          */  
  39.         private var currentState:int;  
  40.         /** 
  41.          * 字符类型 
  42.          */  
  43.         public static const CHARS:String="chars";  
  44.         /** 
  45.          * 字节类型 
  46.          */  
  47.         public static const BYTES:String="bytes";  
  48.           
  49.           
  50.         public function SPSocket()  
  51.         {  
  52.             socket.addEventListener(Event.CONNECT,onConnect);  
  53.             socket.addEventListener(Event.CLOSE,onClose);  
  54.             socket.addEventListener(IOErrorEvent.IO_ERROR,onIoError);  
  55.             socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);  
  56.         }  
  57.           
  58.         public function connect():void{  
  59.             if(!socket.connected){  
  60.                 socket.connect(host,port);  
  61.             }  
  62.         }  
  63.           
  64.         public function close():void{  
  65.             socket.close();  
  66.         }  
  67.         /** 
  68.          * 处理Socket接收数据 
  69.          */  
  70.         private function onSocketData(e:ProgressEvent):void{  
  71.             if(RecieveDataType==BYTES){  
  72.                 var bytes:ByteArray;  
  73.                 socket.readBytes(bytes);  
  74.                 /*trace("收到的数据:"+socket.bytesAvailable+"b/s"); 
  75.                 while(socket.bytesAvailable){ 
  76.                     var data:int=socket.readByte(); 
  77.                     trace(data); 
  78.                 }*/  
  79.             }else if(RecieveDataType==CHARS){  
  80.                 var recieveData:String=socket.readUTFBytes(socket.bytesAvailable);  
  81.             }  
  82.         }  
  83.         /** 
  84.          * 写入数据 
  85.          */  
  86.         public function WriteDate():void{  
  87.             if(socket.connected){  
  88.                   
  89.             }  
  90.         }  
  91.         private function onConnect(e:Event):void{  
  92.             trace("正在连接服务器...");  
  93.         }  
  94.         private function onClose(e:Event):void{  
  95.             trace("正在与服务器断开连接...");  
  96.         }  
  97.         private function onIoError(e:Event):void{  
  98.             trace("正在与服务器断开连接...");  
  99.         }  
  100.     }  
  101. }  


原文参见:http://blog.csdn.net/lx10752p/article/details/6366526

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值