flash与c++进行Socket进行简单通信

一、简介

      用flash去开发应用,免不了网络通讯,特别是网络游戏,需要用到即使通讯。 as3提供了两个支持即时通讯的类:XMLSocket和Socket,

      前者其实是只支持发送字符串,而后者就强大多了,支持发送字节,相对来说比较底层,而这也给我们更多的发挥空间。

      其实,flash socket的网络底层接受数据,就以与c++服务器通讯为列子。


二、代码

   C++代码:

 

#include <iostream>///加载需要的头文件 关于输入输出
#include <winsock2.h> ///socket套接字头文件
using namespace std; ///使std命名空间全部展开不用每次在写std::前缀了


WSADATA wsaData;//WSADATA 是一个结构 说明需要装载的dll的版本相关信息
SOCKET listeningSocket;//监听连接的socket
SOCKET newConnection;//已经连接的socket
SOCKADDR_IN serverAddr;//服务器的相关信息
SOCKADDR_IN clientAddr;//连接端的相关信息
char message[256];//用来读取客户的发送来的消息


int main(int argc, char *argv[])///程序的入口
{
     //装载dll文件
     WSAStartup(MAKEWORD(2,2),&wsaData);
     //创建一个新的嵌套字来监听客户端连接,使用TCP协议
     listeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
     //建立SOCKADDR_IN结构,为bind做好准备
     serverAddr.sin_family = AF_INET;
     serverAddr.sin_port = htons(30006);
     serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
     bind(listeningSocket,(SOCKADDR*)(&(serverAddr)),sizeof(serverAddr));  

     listen(listeningSocket,5);  //开始监听,最多可以处理的连接请求为5

     int ClientAddrLen = sizeof(struct sockaddr_in);   //struct sockaddr_in结构的大小
     //****等待连接,一直阻塞到获得连接
     //返回连接的socket
     //参数1 被绑定的socket
     //参数2 当发生请求时被填充的结构
     //参数3 第2个参数的结构大小 这里必须给的是地址
     newConnection = accept(listeningSocket,(SOCKADDR*)(&clientAddr),&ClientAddrLen);

     //****发送数据**** 
     //参数1是已连接的socket
     //参数2是一个字符串
     //参数3是字符串的大小
     //参数4是状态默认为0
     send(newConnection,"socket is ok\0",(int)strlen("socket is ok\0")+1,0);

     //****接收数据****
     //参数1是已连接的socket
     //参数2是一个char数组
     //参数3是传送中最多所能容纳的字节数  
     //参数4是状态默认0
     recv(newConnection,message,256,0);

     cout<<"flash传递过来的参数是"<<message<<endl;     

     //关闭socket
     closesocket(newConnection);
     closesocket(listeningSocket);
     WSACleanup();

    system("PAUSE"); ///让屏幕出现按任意键结束的提示没有此句程序运行直接退出
    return EXIT_SUCCESS; ///返回
}

    ActionScript代码:

package
{
    import flash.utils.ByteArray;
    import flash.net.Socket;
    import flash.events.ProgressEvent
    import flash.display.Sprite;
   
    public class Client extends Sprite
    {
       private var socket:Socket = new Socket();  
       private var byteArray:ByteArray = new ByteArray();  
       public function Client()
       {
           socket.connect("127.0.0.1",30006);
           socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
		    trace("启动Socket。。。。。。");
       } 
       function onSocketData(e:ProgressEvent ):void
       {
           socket.readBytes(byteArray);
           trace("c++传递过来的参数:"+byteArray);
           socket.writeBytes(byteArray);
           socket.flush();
       }
    }
}


注意:  未解决flash安全沙箱问题,该实例的运行flash 是运行在 adobe flash cs4上的。

    关于flash安全沙箱问题的解决在文章:flash socket通讯安全沙箱问题解决 中说明

你可能感兴趣的:(C++,socket,actionscript,通讯)