이거 제가 쓰려고 만들었었는데, 이어 받기도 되고, 더 좋은 파일서버가 많아서 만들다가 포기했던.....
최근에 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>

 각종 air에서 제공하는 js파일들은 여기에 다 있습니다.
AdobeAIRSDK\frameworks\libs\air 

개발관련된 문서는 여기에!
http://www.adobe.com/devnet/air/articles/getting_started_air_js.html 
 
풀소스는 여기에!
https://github.com/mudchobo/SimpleFileServer  

 
 
Posted by 머드초보
,