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区域点击,从控制台窗口中可以看到通信内容。