一、简介
用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; ///返回 }
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通讯安全沙箱问题解决 中说明