序
本文主要记录AS3(flash)基于socket连接ftp服务的处理过程,过程比较艰难,坑很多,记录下来,也许能够帮到有缘人。限于公司相关政策,未能放出全部源码请见谅,主要提供解决思路,以及相关问题的处理。
相关技术
- AS3 socket ,主要用于ftp连接处理;
- ftp命令以及参数响应 ,进行数据交互的过程理解;
- flash FileReference 类 ,文件选择;
- flash 安全沙箱,以及端口授权 ;
- AS,js交互;
- ftp 被动模式传输的丢包问题,如果有拆包处理,并且发送的文件不完整;
实现过程简述
基本结构如下图所示:
- flash客户端编写
实现思路
使用FileReference来进行文件选择,注册监听
fileReference.addEventListener(Event.SELECT, onFileSelect);//文件选择触发
fileReference.addEventListener(ProgressEvent.PROGRESS, progressHandle);//文件加载监听,用于刷新百分比进度
fileReference.addEventListener(Event.COMPLETE, completeHandle);//文件加载完成事件
在completeHandle中调用我们实现的ftp上传服务处理。
其中过程注册的js交互方法就不列举了。
Socket交互处理
private function connect():void{
Security.loadPolicyFile("xmlsocket://"+serverIP+":"+_securityPort);
ftpSocket = new Socket();
ftpSocket.addEventListener(ProgressEvent.SOCKET_DATA, ftpSocketDataHandle);
ftpSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,ftpSocketSecurityErrorHandle);
ftpSocket.addEventListener(IOErrorEvent.IO_ERROR,ftpIOErrorHandle);
ftpSocket.addEventListener(Event.CONNECT,onConnect);
ftpSocket.connect(serverIP, serverPort);
}
其中Security.loadPolicyFile方法为授权检查,我们访问的端口需要通过flashplayer的安全沙箱检查,flashplayer会在访问之前调用843端口,这里我们可以明确定义要访问的端口,例如:1234。在ftp服务器需要创建一个socket服务,此处我使用java实现了一个。
package org.jod.web.center.flashUpload;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class