如题!!有一网页游戏用flash做的,发送数据是用amf3.用c#怎么能读取到游戏发送和接收的信息呢?试了很多方法。(本人已经快崩溃了!)希望高手能贴代码参考下。。不胜感激。

解决方案 »

  1.   

    http://www.eb163.com/club/thread-6907-1-1.html
    看看对你有帮助没?
      

  2.   

    给你一段参考代码,希望对你有帮助。
    .NET C# 与Flash用AMF3 SOCKET通信 
    通常,使用Flash来调用.NET组件需用远程调用,实际上我们也可以通过SOCKET直接通信。具体采用Flash的AMF3或AFM0格式,采用流行的FluorineFx服务器组件,具体代码如下: 依照此用法可以开发网页游戏或其它Flash应用的.NET SOCKET服务器。using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Text;
    using System.Threading;
    using System.Net.Sockets;
    using System.Net;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    using FluorineFx;namespace STCServer
    {
        class Monitor
        {
            private int PORT = 8888;
            private const int MAXPKSIZE = 4096;
            private TcpListener tcpLs = null;
            private List<Client> clients = new List<Client>();        public void Close()
            {
                if (tcpLs != null)
                {
                    tcpLs.Stop();
                }
                if (clients.Count != 0)
                {
                    foreach (Client c in clients)
                    {
                        c.sock.Shutdown(SocketShutdown.Both);
                        c.thread.Abort();
                    }
                    clients.Clear();
                    clients = null;
                }
            }       private void ThreadFunc(object client)
            {
                Client ct =client as Client;
                Socket sk = ct.sock;
                byte[] cmdBuff = new byte[MAXPKSIZE];            while (true)
                {
                    try
                    {
                        cmdBuff.Initialize();
                        int N =sk.Receive(cmdBuff);
                        Console.WriteLine(DateTime.Now.ToString()+":接收数据成功,长度:"+N );                    System.IO.MemoryStream ms = new System.IO.MemoryStream(cmdBuff, 0, N);
                        FluorineFx.AMF3.ByteArray ba = new FluorineFx.AMF3.ByteArray(ms);                                      
                        Node o = (Node)ba.ReadObject();
                        Console.WriteLine(o.ID);
                        Console.WriteLine(o.Name);
                        Console.WriteLine(o.Address);
                        o.Name = "张三";
                        Node node = new Node();
                        node.ID = o.ID;
                        node.Name = o.Name;
                        node.Address = o.Address;                    FluorineFx.AMF3.ByteArray result = new FluorineFx.AMF3.ByteArray();
                        result.WriteObject(node);
                        byte[] buf = new byte[result.Length];
                        result.Position = 0;
                        result.ReadBytes(buf, (uint)0, (uint)buf.Length);
                        foreach (Client cl in clients)
                        {                      
                            cl.sock.Send(buf,buf.Length,SocketFlags.None);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("网络终止:" + e.Message);
                        ct.sock.Shutdown(SocketShutdown.Both);
                        clients.Remove(ct);
                        Thread.CurrentThread.Abort();
                        ct = null;
                    }
                }
            }
            public void StartUp()
            {
                IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
                tcpLs = new TcpListener(ip, PORT);
                tcpLs.Start();
                while (true)
                {
                    byte[] packetBuff = new byte[MAXPKSIZE];
                    Console.WriteLine("服务器已启动,正在监听...\n");
                    Console.WriteLine(string.Format("服务器IP:{0}\t端口号:{1}\n", ip, PORT));                Socket sk = tcpLs.AcceptSocket();
                    Console.WriteLine("已经连接,接收数据...\n");
                    Thread cth = new Thread(new ParameterizedThreadStart(ThreadFunc));
                    Client cl = new Client(sk,cth);
                    clients.Add(cl);              
                    cth.Start(cl);
                }
            }
        }
    } namespace STCServer
    {
        class Client
        {
            public Socket sock=null;
            public Thread thread = null;
            public Client(Socket s, Thread th)
            {
                sock = s;
                thread = th;
            }    }
    }
    namespace STCServer
    {
        public class Node
        {
            public uint ID;
            public string Name;
            public string Address;
        }
    }
    Flash(FLEX)客户端: package
    {
     import flash.events.*;
     import flash.net.ObjectEncoding;
     import flash.net.Socket;
     import flash.net.registerClassAlias;
     import flash.utils.ByteArray; 
     public class Greeter
     {
      private var socket :Socket;
         public function sayHello():void        {
             registerClassAlias("STCServer.Node",Node);
             socket = new Socket();
             socket.addEventListener(Event.CONNECT,onHandler);
             socket.addEventListener(ProgressEvent.SOCKET_DATA, onHandler);           socket.objectEncoding=ObjectEncoding.AMF3;
             socket.connect("192.168.1.14",8888); 
             var node:Node=new Node();
             node.ID=122;
             node.Name="绔嬪姏";
             node.Address="kkkkkkk";
             var num:Number;
             trace(num);
             var arr:ByteArray=new ByteArray;
             arr.writeObject(node);
       arr.compress();
             socket.writeBytes(arr);
             socket.flush();
    }  public function  onHandler(event:Event):void
      {
       switch(event.type) {  
                    case ProgressEvent.SOCKET_DATA:
                     trace(new Date());
                     trace("鏁版嵁鎺ュ彈鎴愬姛");  
                        var bytes:ByteArray = new ByteArray();  
                        socket.readBytes(bytes);  
                        bytes.uncompress();  
                        var node:Node;
                        node=Node(bytes.readObject());
                        trace(node.Name);
                        trace(node.ID);
                        trace(node.Address);  
                        break;  
                    case Event.CLOSE:  
                        trace("杩炴帴鍏抽棴");  
                        break;  
                    case Event.CONNECT:  
                        trace("杩炴帴涓?..");  
                        break;  
                    case IOErrorEvent.IO_ERROR:  
                    case SecurityErrorEvent.SECURITY_ERROR:  
                        trace("杩炴帴澶辫触");  
                        break;  
                }    
      }
     }
    }package
    {
     public class Node
     {
      public var ID :uint;
       public var Name :String;
       public var Address :String;
       public function Node()
      {
      } 
     }
    } <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" 
        layout="vertical"
        creationComplete = "initApp()" >
        
        <mx:Script>
            <![CDATA[
                private var myGreeter:Greeter = new Greeter();
                
                public function initApp():void 
                {
                    // says hello at the start, and asks for the user's name
                    mainTxt.text = myGreeter.sayHello();
                }
            ]]>
        </mx:Script>    <mx:TextArea id = "mainTxt" width="400" />        
        
    </mx:Application>