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应用窗台,控制台应用程序,或者打包成服务等等
下面以控制台为例子
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
using System.Net;
-
using System.Net.Sockets;
-
using System.Threading;
-
using System.Collections;
-
namespace serverSocket
-
{
-
class Program
-
{
-
private Thread Beginthread, receivethread;
-
private Socket serverSocket, ClientSocket;
-
-
static void Main(string[] args)
-
{
-
Program program = new Program();
-
IPEndPoint remotePoint = new IPEndPoint(IPAddress.Any, 843);
-
program.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-
program.serverSocket.Bind(remotePoint);
-
program.serverSocket.Listen(10);
-
Console.WriteLine("Listening...");
-
program.Beginthread = new Thread(new ThreadStart(program.BeginListen));
-
program.Beginthread.Start();
-
}
-
-
private void BeginListen()
-
{
-
while (true)
-
{
-
ClientSocket = serverSocket.Accept();
-
receivethread = new Thread(new ThreadStart(receive));
-
receivethread.Start();
-
}
-
}
-
-
private void receive()
-
{
-
IPEndPoint clienTep = (IPEndPoint)ClientSocket.RemoteEndPoint;
-
int bytes = 0;
-
while (true)
-
{
-
Byte[] buffer = new Byte[24];
-
bytes = ClientSocket.Receive(buffer);
-
if (bytes > 0)
-
{
-
string clientCommand = Encoding.UTF8.GetString(buffer, 0, bytes);
-
String policy = "<cross-domain-policy><allow-access-from domain=/"*/" to-ports=/"1111/" /></cross-domain-policy>/0";
-
buffer = System.Text.Encoding.UTF8.GetBytes(policy.ToCharArray());
-
ClientSocket.Send(buffer, buffer.Length, 0);
-
}
-
else
-
{
-
break;
-
}
-
}
-
ClientSocket.Close();
-
receivethread.Abort();
-
}
-
}
-
}
as socket程序更简单如下
-
package Socket
-
{
-
import flash.events.Event;
-
import flash.events.IOErrorEvent;
-
import flash.events.ProgressEvent;
-
import flash.net.Socket;
-
import flash.utils.ByteArray;
-
-
public class SPSocket
-
{
-
-
-
-
public var socket:Socket=new Socket();
-
-
-
-
public var host:String="localhost";
-
-
-
-
public var port:int=1111;
-
-
-
-
public var RecieveDataType:String="";
-
-
-
-
public var SendDataType:String="";
-
-
-
-
-
private var stateMap:Object;
-
-
-
-
private var currentState:int;
-
-
-
-
public static const CHARS:String="chars";
-
-
-
-
public static const BYTES:String="bytes";
-
-
-
public function SPSocket()
-
{
-
socket.addEventListener(Event.CONNECT,onConnect);
-
socket.addEventListener(Event.CLOSE,onClose);
-
socket.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
-
socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
-
}
-
-
public function connect():void{
-
if(!socket.connected){
-
socket.connect(host,port);
-
}
-
}
-
-
public function close():void{
-
socket.close();
-
}
-
-
-
-
private function onSocketData(e:ProgressEvent):void{
-
if(RecieveDataType==BYTES){
-
var bytes:ByteArray;
-
socket.readBytes(bytes);
-
-
-
-
-
-
}else if(RecieveDataType==CHARS){
-
var recieveData:String=socket.readUTFBytes(socket.bytesAvailable);
-
}
-
}
-
-
-
-
public function WriteDate():void{
-
if(socket.connected){
-
-
}
-
}
-
private function onConnect(e:Event):void{
-
trace("正在连接服务器...");
-
}
-
private function onClose(e:Event):void{
-
trace("正在与服务器断开连接...");
-
}
-
private function onIoError(e:Event):void{
-
trace("正在与服务器断开连接...");
-
}
-
}
-
}
原文参见:http://blog.csdn.net/lx10752p/article/details/6366526
flex与C# Socket通信
原文:http://blog.csdn.net/shileimohan/article/details/44565217