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