1.說明
為什么說是冷知識芬探,因為大多數(shù)項目用不到,所以歸類為冷知識厘惦。
本文主要介紹如何將SMB協(xié)議轉(zhuǎn)換為常見的HTTP協(xié)議偷仿,以便利用各種播放器實現(xiàn)在線播放。本文與前篇《利用SMB協(xié)議遠(yuǎn)程查看電腦文件或者其他存儲設(shè)備》存在關(guān)聯(lián)。
2.用到的資源:
cybergarage.jar(這個做好久了酝静,具體地址找不到了节榜,自己搜搜看看吧)
3.核心代碼
PlayFileService.java
,需要在主配置文件中注冊,并在應(yīng)用啟動或者需要轉(zhuǎn)換的時候開啟改服務(wù)宗苍。
package com.powerstick.service;
import org.cybergarage.http.HTTPServerList;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class PlayFileService extends Service {
private FileServer fileServer = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
fileServer = new FileServer();
fileServer.start();
}
@Override
public void onDestroy() {
super.onDestroy();
HTTPServerList httpServerList = fileServer.getHttpServerList();
httpServerList.stop();
httpServerList.close();
httpServerList.clear();
fileServer.interrupt();
}
}
FileServer.java
,需要在轉(zhuǎn)換服務(wù)中啟動該線程亿遂。
package com.powerstick.service;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLDecoder;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import org.cybergarage.http.HTTPRequest;
import org.cybergarage.http.HTTPRequestListener;
import org.cybergarage.http.HTTPResponse;
import org.cybergarage.http.HTTPServerList;
import org.cybergarage.http.HTTPStatus;
import com.powerstick.BaseApplication;
import com.powerstick.utils.FileUtils;
public class FileServer extends Thread implements HTTPRequestListener {
public static final String CONTENT_EXPORT_URI = "/smb";
private HTTPServerList httpServerList = new HTTPServerList();
// 默認(rèn)的共享端口
private int HTTPPort = 2222;
// 綁定的ip
private String bindIP = null;
public String getBindIP() {
return bindIP;
}
public void setBindIP(String bindIP) {
this.bindIP = bindIP;
}
public HTTPServerList getHttpServerList() {
return httpServerList;
}
public void setHttpServerList(HTTPServerList httpServerList) {
this.httpServerList = httpServerList;
}
public int getHTTPPort() {
return HTTPPort;
}
public void setHTTPPort(int hTTPPort) {
HTTPPort = hTTPPort;
}
@Override
public void run() {
super.run();
/**************************************************
*
* 創(chuàng)建http服務(wù)器蛇数,接收共享請求
*
*************************************************/
// 重試次數(shù)
int retryCnt = 0;
// 獲取端口 2222
int bindPort = getHTTPPort();
HTTPServerList hsl = getHttpServerList();
while (hsl.open(bindPort) == false) {
retryCnt++;
// 重試次數(shù)大于服務(wù)器重試次數(shù)時返回
if (100 < retryCnt) {
return;
}
setHTTPPort(bindPort + 1);
bindPort = getHTTPPort();
}
// 給集合中的每個HTTPServer對象添加HTTPRequestListener對象
hsl.addRequestListener(this);
// 調(diào)用集合中所有HTTPServer的start方法
hsl.start();
FileUtils.ip = hsl.getHTTPServer(0).getBindAddress();
FileUtils.port = hsl.getHTTPServer(0).getBindPort();
}
@Override
public void httpRequestRecieved(HTTPRequest httpReq) {
String uri = httpReq.getURI();
System.out.println("uri*****" + uri);
if (uri.startsWith(CONTENT_EXPORT_URI) == false) {
httpReq.returnBadRequest();
return;
}
try {
uri = URLDecoder.decode(uri, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
System.out.println("uri=====" + uri);
if (uri.length() < 6) {
return;
}
// 截取文件的信息
String filePaths = "smb://" + uri.substring(5);
System.out.println("filePaths=" + filePaths);
// 判斷uri中是否包含參數(shù)
int indexOf = filePaths.indexOf("&");
if (indexOf != -1) {
filePaths = filePaths.substring(0, indexOf);
}
try {
SmbFile file = new SmbFile(filePaths,
BaseApplication.getInstance().getAuthentication());
// 獲取文件的大小
long contentLen = file.length();
// 獲取文件類型
String contentType = FileUtils.getMIMEType(file.getName());
System.out.println("contentType=====" + contentType);
// 獲取文文件流
InputStream contentIn = file.getInputStream();
if (contentLen <= 0 || contentType.length() <= 0
|| contentIn == null) {
httpReq.returnBadRequest();
return;
}
HTTPResponse httpRes = new HTTPResponse();
httpRes.setContentType(contentType);
httpRes.setStatusCode(HTTPStatus.OK);
httpRes.setContentLength(contentLen);
httpRes.setContentInputStream(contentIn);
httpReq.post(httpRes);
contentIn.close();
} catch (MalformedURLException e) {
// httpReq.returnBadRequest();
return;
} catch (SmbException e) {
// httpReq.returnBadRequest();
return;
} catch (IOException e) {
// httpReq.returnBadRequest();
return;
}
}
}
*其中涉及BaseApplication的碌上,可以在前篇文章中看到浦徊;FileUtils中定義了靜態(tài)變量ip="127.0.0.1",port=0,其他的就用到了根據(jù)文件名稱獲取MIME類型的方法,由于方法簡單且代碼太長就不貼了
4.開啟/關(guān)閉轉(zhuǎn)換服務(wù)
Intent intent = new Intent(this, PlayFileService.class);
startService(intent);
Intent intent = new Intent(this, PlayFileService.class);
stopService(intent);
其他相關(guān)
- ** 利用SMB協(xié)議遠(yuǎn)程查看電腦文件或者其他存儲設(shè)備: ** http://www.reibang.com/p/6b322df0f68b