이거 제가 쓰려고 만들었었는데, 이어 받기도 되고, 더 좋은 파일서버가 많아서 만들다가 포기했던.....
최근에 Adobe AIR로 개발할 일이 생겼는데, HTML + Javascript 구조로 가져가면 유지보수도 편하게 할 수 있고, Javascript공부에 더 좋을 것 같아서 일단 기록해둡니다....
html+js로 Adobe AIR는 개발을 안해봤는데, 해보니까 그리 어렵지도 않고, 기존 ActionScript3 클래스를 그대로 포팅이 되어서 그걸 air.클래스명 해서 그대로 쓰면 돼서 어렵진 않았네요. 다만 디버깅할 도구가 조금 부족하다는 것이 좀 아쉽습니다.
이걸 이용한 툴이 그나마 드림위버인데, 드림위버는 저랑 맞지 않는 것 같습니다. 그래서 그냥 Aptana3로 개발을 하고, AIR에서 제공하는 AIRIntrospector.js를 이용해서 하니까 디버깅도 그리 불편하진 않네요.
각종 air에서 제공하는 js파일들은 여기에 다 있습니다.
AdobeAIRSDK\frameworks\libs\air
개발관련된 문서는 여기에!
http://www.adobe.com/devnet/air/articles/getting_started_air_js.html
풀소스는 여기에!
https://github.com/mudchobo/SimpleFileServer
최근에 Adobe AIR로 개발할 일이 생겼는데, HTML + Javascript 구조로 가져가면 유지보수도 편하게 할 수 있고, Javascript공부에 더 좋을 것 같아서 일단 기록해둡니다....
html+js로 Adobe AIR는 개발을 안해봤는데, 해보니까 그리 어렵지도 않고, 기존 ActionScript3 클래스를 그대로 포팅이 되어서 그걸 air.클래스명 해서 그대로 쓰면 돼서 어렵진 않았네요. 다만 디버깅할 도구가 조금 부족하다는 것이 좀 아쉽습니다.
이걸 이용한 툴이 그나마 드림위버인데, 드림위버는 저랑 맞지 않는 것 같습니다. 그래서 그냥 Aptana3로 개발을 하고, AIR에서 제공하는 AIRIntrospector.js를 이용해서 하니까 디버깅도 그리 불편하진 않네요.
<html>
<head>
<title>Simple File Server</title>
<link rel="stylesheet" type="text/css" href="/css/main.css" />
<script type="text/javascript" src="/js/lib/AIRAliases.js"></script>
<script type="text/javascript" src="/js/lib/AIRIntrospector.js"></script>
<script type="text/javascript" src="/js/lib/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
// 기본값 지정
var port = 50000;
var shareFolder = air.File.documentsDirectory;
var serverSocket;
var isStart = false;
$(document).ready(function(){
$("#inputPort").val(port);
$("#inputShareFolder").val(shareFolder.nativePath);
shareFolder.addEventListener(air.Event.SELECT, selectShareFolderHandler);
$("#btnStart").click(function(){
if (!isStart){
try{
serverSocket = new air.ServerSocket();
serverSocket.addEventListener(air.Event.CONNECT, connectSocketHandler);
serverSocket.bind($("#inputPort").val());
serverSocket.listen();
isStart = true;
$(this).attr("value", "중지");
} catch(e){
alert("에러! = " + e.message);
}
} else {
serverSocket.removeEventListener(air.Event.CONNECT, connectSocketHandler);
serverSocket.close();
isStart = false;
$(this).attr("value", "시작");
}
});
$("#btnBrowser").click(function(){
shareFolder.browseForDirectory("폴더를 선택하세요.");
});
});
function selectShareFolderHandler(e){
$("#inputShareFolder").val(shareFolder.nativePath);
}
function connectSocketHandler(e){
var socket = e.socket;
socket.addEventListener(air.ProgressEvent.SOCKET_DATA, proressSocketHandler);
}
function proressSocketHandler(e){
var socket = e.target;
var bytes = new air.ByteArray();
socket.readBytes(bytes);
var request = "" +bytes;
air.Introspector.Console.log("request = " + bytes);
var path = request.substring(5, request.indexOf("HTTP/") - 1);
air.Introspector.Console.log("path = " + path);
var file = shareFolder.resolvePath(path);
air.Introspector.Console.log(file.nativePath);
air.Introspector.Console.log(file.exists);
if (file.isDirectory){
socket.writeUTFBytes("HTTP/1.1 200 OK\n");
socket.writeUTFBytes("<html><body><ul></ul></body></html>");
}
else if (file.exists && !file.isDirectory){
var stream = new air.FileStream();
stream.open(file, air.FileMode.READ);
var content = new air.ByteArray();
stream.readBytes(content);
stream.close();
socket.writeUTFBytes("HTTP/1.1 200 OK\n");
socket.writeUTFBytes("Content-Disposition: attachment;filename=" + path + "\n");
socket.writeUTFBytes("Content-Length: " + file.size + "\n");
socket.writeUTFBytes("\n");
socket.writeBytes(content);
} else {
socket.writeUTFBytes("HTTP/1.1 404 Not Found\n");
socket.writeUTFBytes("Content-Type: text/html\n\n");
socket.writeUTFBytes("<html><body><h2>Page Not Found</h2></body></html>");
}
socket.flush();
socket.close();
log(file.nativePath);
}
function log(s){
$(".divStatus").prepend("<div>" + s + "</div>");
}
</script>
</head>
<body>
포트 : <input type="text" id="inputPort" /><br />
공유폴더 : <input type="text" id="inputShareFolder" disabled="true"/>
<input type="button" id="btnBrowser" value="폴더선택"/><br />
<input type="button" id="btnStart" value="시작"/>
<div class="divStatus">
</div>
</body>
</html>
<head>
<title>Simple File Server</title>
<link rel="stylesheet" type="text/css" href="/css/main.css" />
<script type="text/javascript" src="/js/lib/AIRAliases.js"></script>
<script type="text/javascript" src="/js/lib/AIRIntrospector.js"></script>
<script type="text/javascript" src="/js/lib/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
// 기본값 지정
var port = 50000;
var shareFolder = air.File.documentsDirectory;
var serverSocket;
var isStart = false;
$(document).ready(function(){
$("#inputPort").val(port);
$("#inputShareFolder").val(shareFolder.nativePath);
shareFolder.addEventListener(air.Event.SELECT, selectShareFolderHandler);
$("#btnStart").click(function(){
if (!isStart){
try{
serverSocket = new air.ServerSocket();
serverSocket.addEventListener(air.Event.CONNECT, connectSocketHandler);
serverSocket.bind($("#inputPort").val());
serverSocket.listen();
isStart = true;
$(this).attr("value", "중지");
} catch(e){
alert("에러! = " + e.message);
}
} else {
serverSocket.removeEventListener(air.Event.CONNECT, connectSocketHandler);
serverSocket.close();
isStart = false;
$(this).attr("value", "시작");
}
});
$("#btnBrowser").click(function(){
shareFolder.browseForDirectory("폴더를 선택하세요.");
});
});
function selectShareFolderHandler(e){
$("#inputShareFolder").val(shareFolder.nativePath);
}
function connectSocketHandler(e){
var socket = e.socket;
socket.addEventListener(air.ProgressEvent.SOCKET_DATA, proressSocketHandler);
}
function proressSocketHandler(e){
var socket = e.target;
var bytes = new air.ByteArray();
socket.readBytes(bytes);
var request = "" +bytes;
air.Introspector.Console.log("request = " + bytes);
var path = request.substring(5, request.indexOf("HTTP/") - 1);
air.Introspector.Console.log("path = " + path);
var file = shareFolder.resolvePath(path);
air.Introspector.Console.log(file.nativePath);
air.Introspector.Console.log(file.exists);
if (file.isDirectory){
socket.writeUTFBytes("HTTP/1.1 200 OK\n");
socket.writeUTFBytes("<html><body><ul></ul></body></html>");
}
else if (file.exists && !file.isDirectory){
var stream = new air.FileStream();
stream.open(file, air.FileMode.READ);
var content = new air.ByteArray();
stream.readBytes(content);
stream.close();
socket.writeUTFBytes("HTTP/1.1 200 OK\n");
socket.writeUTFBytes("Content-Disposition: attachment;filename=" + path + "\n");
socket.writeUTFBytes("Content-Length: " + file.size + "\n");
socket.writeUTFBytes("\n");
socket.writeBytes(content);
} else {
socket.writeUTFBytes("HTTP/1.1 404 Not Found\n");
socket.writeUTFBytes("Content-Type: text/html\n\n");
socket.writeUTFBytes("<html><body><h2>Page Not Found</h2></body></html>");
}
socket.flush();
socket.close();
log(file.nativePath);
}
function log(s){
$(".divStatus").prepend("<div>" + s + "</div>");
}
</script>
</head>
<body>
포트 : <input type="text" id="inputPort" /><br />
공유폴더 : <input type="text" id="inputShareFolder" disabled="true"/>
<input type="button" id="btnBrowser" value="폴더선택"/><br />
<input type="button" id="btnStart" value="시작"/>
<div class="divStatus">
</div>
</body>
</html>
각종 air에서 제공하는 js파일들은 여기에 다 있습니다.
AdobeAIRSDK\frameworks\libs\air
개발관련된 문서는 여기에!
http://www.adobe.com/devnet/air/articles/getting_started_air_js.html
풀소스는 여기에!
https://github.com/mudchobo/SimpleFileServer