Flex利用socket实现断点续传(二)
发布时间:2020-12-15 03:51:29 所属栏目:百科 来源:网络整理
导读:上一篇博文中展示给大家ActionScript的代码,当初学的时候就学了半年多,又两年多没有使用Flex,其中一些东西有所生疏 不过上篇博文中的内容对于有一定Flex功底的人来说还是比较简单的。闲话少续下面展示java代码。首先配置listener共两个。 ? !-- 大文件上
? <!-- 大文件上传端口监听器 -->
<listener>
<display-name>myListener</display-name>
<listener-class>com.ibm.rise.workplace.fileoperation.LargeFileUploadListener</listener-class>
</listener>
<!-- 大文件上传端口安全策略监听器 -->
<listener>
<display-name>myListener</display-name>
<listener-class>com.ibm.rise.workplace.fileoperation.LargeFileUploadPolicyListener</listener-class>
</listener>
摘自东哥的博文: 在flash.net包中存在Socket类,在文档的描述中,我们可以了解到socket通信需要使用套接字策略文件。在实际的socket通信过程中,我们在客户端不管发送什么信息,在服务端的socket第一次接收的信息都会是<policy-file-request/>。这个信息是在要求服务端提供给客户端socket通信的策略文件,在该文件中指定通信的端口号等信息。这个过程涉及到Flash Player安全机制,不过多讲述,了解到flex进行跨域socket通信时默认必须要在843端口上接收Flash Player的策略文件请求。此处需要注意的是对策略文件的请求和断点续传过程主动发起的请求同服务端的socket连接是两个独立的连接,在处理完策略文件请求连接后,我们要关闭策略文件请求的连接,这样Flash Player会自动重新连接,从而可实现断点续传的socket连接,否则我们的主动请求将无法连接上。 针对上面术的内容,我做了这样处理:建立两个两个listener,一个监听对策略文件的请求,一个监听对断点续传socket连接的请求,后者是我们的主请求。在每个监听器使用多线程处理,每次接受到socket连接请求,就会创建一个线程用于处理策略文件请求或者断点续传请求。 ? LargeFileUploadListener ? package com.ibm.rise.workplace.fileoperation;
import java.net.ServerSocket;
import java.net.Socket;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletException;
public class LargeFileUploadListener extends javax.servlet.http.HttpServlet implements javax.servlet.ServletContextListener{
private static final long serialVersionUID = 1L;
private static Thread thread = null;
@Override
public void init() throws ServletException {
try {
thread = new Thread() {
public void run() {
try{
ServerSocket serverSocket= new ServerSocket(Integer.parseInt("1234"));//服务器套接字
Socket clientSocket=null;
while(true){
clientSocket= serverSocket.accept();//获得客户端的请求的Socket
System.out.println("已侦听到了客户端开始上传文件的请求。。。。。");
new MyServerThread(clientSocket);
}
}catch (Exception e) {
e.printStackTrace();
}
}
};
thread.start();
} catch (Exception e) {
}
}
@SuppressWarnings("deprecation")
public void contextDestroyed(ServletContextEvent arg0) {
if(thread != null){
thread = null;
}
}
public void contextInitialized(ServletContextEvent arg0) {
try {
thread = new Thread() {
public void run() {
try{
//大文件上传侦听开始
ServerSocket serverSocket= new ServerSocket(Integer.parseInt("1234"));//服务器套接字
Socket clientSocket=null;
while(true){
clientSocket= serverSocket.accept();//获得客户端的请求的Socket
new MyServerThread(clientSocket);
}
}catch (Exception e) {
}
}
};
thread.start();
} catch (Exception e) {
}
}
}
package com.ibm.rise.workplace.fileoperation;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
/**
* @Description 超大文件上传服务器端
* MyServerThread.java
* @date 2011 上午11:41:03
*/
public class MyPolicyServerThread extends Thread {
private Socket socket;
private final String policy_xml = "<policy-file-request/>";
private final String cross_xml = "<?xml version="1.0"?>" +
"<cross-domain-policy>" +
"<site-control permitted-cross-domain-policies="all"/>" +
"<allow-access-from domain="*" to-ports="1234"/>" +
"</cross-domain-policy> |