VC与FLASH通过SOCKET通信

1. 新建一个MFC对框框项目,例如FlashSocket。记得在向导中选择ActiveX控件支持。

2. 在对话框中右键单击“添加ActiveX控件”,插入一个Shock Wave Flash Object控件。

3. 为上述控件添加一个关联的变量m_flashPlayer到对话框类,同时会自动创建CShockwaveflash1类文件。

CShockwaveflash1 m_flashPlayer;

4. 在对话框类中添加如下成员变量:

    SOCKET sockSrv;
    SOCKET sockConn;
    SOCKADDR_IN addrSrv;
    SOCKADDR_IN addrClient;

5. 在对话框中添加如下函数,用来初始化SOCKET:

bool CFlashSocketDlg::InitSocket(void)
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    short port=1800;//端口号

    wVersionRequested = MAKEWORD( 1, 1 );
    err = WSAStartup( wVersionRequested, &wsaData );//初始化套接字
    if ( err != 0 )
    {
        return false;
    }

    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
    {
        WSACleanup( );
        return false;
    }

    sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(port);

    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//绑定端口
    listen(sockSrv,5);//侦听

    printf("Server %d is listening......\n",port);
    ::CreateThread(NULL,0,SocketThread,this,0,0);
    return true;
}

6. 在OnInitDialog中添加如下代码,加载FLASH,初始化SOCKET:
    m_flashPlayer.LoadMovie(0,"F:\\Adobe Flash CS5\\Socket\\Socket.swf");
    InitSocket();

7. SOCKET通信线程:

DWORD WINAPI SocketThread(PVOID param)
{
    CFlashSocketDlg* pDlg=(CFlashSocketDlg*)param;

    char buf[4096];//接收的数据
    Sleep(1000);
    int len=sizeof(SOCKADDR);
    pDlg->sockConn=accept(pDlg->sockSrv,(SOCKADDR*)&(pDlg->addrClient),&len);
    printf("Accept connection from %s\n",inet_ntoa(pDlg->addrClient.sin_addr));
    while(1)
    {
        int bytes;
        if((bytes=recv(pDlg->sockConn,buf,sizeof(buf),0))==SOCKET_ERROR)
        {
            printf("接收数据失败!\n");
            exit(-1);
        }

        buf[bytes]='\0';
        printf("Message from %s: %s\n",inet_ntoa(pDlg->addrClient.sin_addr),buf);        

        for(int i=0;i<4096;i++)
        {
            buf[i]='*';
        }
        buf[4095]='\0';
        if(send(pDlg->sockConn,buf,strlen(buf)+1,0)==SOCKET_ERROR)
        {
            printf("发送数据失败!");
            exit(-1);
        }
        printf("Message to %s: %s\n",inet_ntoa(pDlg->addrClient.sin_addr),buf);
    }
    return 0;
}

8. 至此,MFC部分的SOCKET通信代码已经完成。总结如下:

通过插入Flash ActiveX空间,使MFC程序可以加载FLASH。

通过增加相关变量和初始化函数,建立SOCKET通信的基础。

通过通信线程不停地从SOCKET接收和发送数据。

9:Flash端的代码如下(AS3.0),这是一个空白的flash,在舞台区域点击鼠标则会通过SOCKET发送数据。

package 
{
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.text.TextField;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.ui.Mouse;
    import flash.display.Stage;
    import flash.display.StageDisplayState;
    import flash.display.StageScaleMode;
    import flash.display.StageAlign;
    import flash.net.Socket;
    import flash.events.*;
    import flash.errors.*;
    import flash.display.SimpleButton;
    public class Main extends Sprite
    {
        private var mySocket:Socket;
        private var star:MovieClip;
        public function Main()
        {
            //隐藏鼠标 
            Mouse.hide();
             ;
            stage.addEventListener(MouseEvent.CLICK, SendData);
            mySocket = new Socket();
            mySocket.addEventListener(Event.CONNECT, OnConnect);
            mySocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            mySocket.addEventListener(ProgressEvent.SOCKET_DATA, receivedata);
            mySocket.connect("127.0.0.1", 1800);
        }
        private function OnConnect(e:Event):void
        {
            trace("连接成功!");
            var str:String = "hahaha\n";
            mySocket.writeUTFBytes(str);
            mySocket.flush();
        }
        //send the message
        private function ioErrorHandler(e:IOErrorEvent):void
        {
            trace("连接失败!");
        }
        private function receivedata(e:ProgressEvent):void
        {
            //trace("收到的字节数"+mySocket.bytesAvailable); 
            var msg:String = "";
            while (mySocket.bytesAvailable)
            {
                msg +=  mySocket.readMultiByte(mySocket.bytesAvailable,"utf8");
            }
            trace("recv:"+msg);
        }
        private function SendData(e:MouseEvent):void
        {
            trace("发送");
            mySocket.writeUTFBytes("I am flash\n");
            mySocket.flush();
        }
    }
}//send message 

10. 测试:打开MFC端程序,在Flash区域点击,从控制台窗口中可以看到通信内容。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值