NodeJS 局域网收发文件

Node作为一个JS运行环境是相当给力。在windows环境下做一个局域网发送文件的软件,使用Java在IO流上繁琐的InputStream、OutputStream间try、catch异常就够了,使用c++难度则更大。Node环境中当然也是用了c++的库,但是在再次封装以后在js使用起来就非常简单,加上ECMAScript6的新语法,使起来给人一种很好的感觉。

Demo http://download.csdn.net/detail/linjiqian/9766743


NodeJS 局域网收发文件_第1张图片
uploaddemo.gif


接收端实现:FileServer.js

Server对象使用on函数绑定连接事件SERVER.on("connection",socket =>{}),每当有新的连接都会获得socket对象。SERVER.listen(CONFG.port,() => {});开始监听一个端口。
  ServerSocket、Socket都是通过绑定data事件获取数据。




//response 响应码
const RESPONSE_H = ["ok","fn_ok"];
//request 请求码
const REQUEST_H = ["thing_fu_thing","thing_f_lin","thing_finish"];

const SERVER_IP = "127.0.0.1";
const SERVER_PORT = 17770;

const FS = require("fs");
const PATH = require('path');
const NET = require("net");

const SERVER = NET.createServer();
const CONFG = {host:SERVER_IP,port:SERVER_PORT};

const USERS = [];

//文件保存目录
const D_PATH = "downloadfiles/";


let isFinish = false;

//连接回调
SERVER.on("connection",socket =>{

    let cIp = socket.remoteAddress.replace(/^.*:/, '');
    let cPort = socket.remotePort;

    console.log(cIp,cPort);
    USERS.push({ip:cIp,port:cPort,socket:socket});

    socket.on("data",data =>{
        console.log(data);
        if(data.toString().trim() == REQUEST_H[0]){
            socket.write(RESPONSE_H[0]);
        }else if(data.toString() == REQUEST_H[1]){
            console.log("同意上传文件");
            //检查保存文件目录是否创建好
            try{
                let stats = FS.statSync(D_PATH);
            }catch(err){
                FS.mkdirSync(D_PATH);
            }
            socket.write(RESPONSE_H[1]);
        }else if(data.toString() == REQUEST_H[2]){
            console.log("文件传送完毕!");
            isFinish = true;
            socket.write("upload finish author www.thinglin.cn ");
        }else{
            console.log("文件数据");
            let filedata = data.toString();
            let filepath = filedata.substring(filedata.indexOf("###path===")+"###path===".length,filedata.indexOf("###size===")); 
            console.log(filedata);
            console.log(filepath);
            
            let paths = filepath.split("\\");
            for(let i=0;i {
                console.log("err = "+err);
            });
            if(isFinish){
                return;
            }
            //继续上传文件
            socket.write(RESPONSE_H[1]);
        }

    });

    socket.on("error",()=>{
        console.log("出错");
    });

    socket.on("end",()=>{
        console.log("连接断开")
    });
});



//监听
SERVER.listen(CONFG.port,() => {
    console.log("文件接收端启动完成");
});





发送端实现:FileClient.js

net模块createConnection(ip,port)函数链接一个server获得Socket。






//upload file || folder  => path  选择要上传的文件|目录
const U_FIlES = ["README.md","test"];


//response 响应码
const RESPONSE_H = ["ok","fn_ok"];
//request 请求码
const REQUEST_H = ["thing_fu_thing","thing_f_lin","thing_finish"];

const FS = require("fs");
const PATH = require('path');
const NET = require("net");

const CONNECT_SERVER_IP = "127.0.0.1"; //server ip
const CONNECT_SERVER_PORT = 17770; // server port
const CLIENT = NET.createConnection(CONNECT_SERVER_PORT,CONNECT_SERVER_IP);

const readFiles = []; //文件缓冲

console.log("---读取文件---");

//初始化,读取文件
(() => {
    function searchFile(path) {
        try{
            let stats = FS.statSync(path);
            if(stats.isFile()){
                let data = FS.readFileSync(path);
                readFiles.push({absPath:path,size:stats.size,data:data});
            }else if(stats.isDirectory()){
                let dirfiles = FS.readdirSync(path);
                for(let i = 0;i {
    console.log('连接成功');
    //请求上传文件
    CLIENT.write(REQUEST_H[1]);
});

let progress = 0;

CLIENT.on('data', data =>{
    console.log(data.toString());
    if(data.toString() == RESPONSE_H[0]){
        //请求上传文件
        CLIENT.write(REQUEST_H[1]);
    }else if(data.toString() == RESPONSE_H[1]){
        if(readFiles.length == progress){
            return;
        }
        console.log("开始文件传输");

        let filedata = `###path===`+readFiles[progress].absPath+`###size===`+readFiles[progress].size+`###data===`+readFiles[progress].data+``;
        CLIENT.write(filedata);
        progress++;
        if(readFiles.length == progress){
            console.log("-- 传送完毕 -- author ThingLin 170228 [email protected]");
            CLIENT.write(REQUEST_H[2]);
        }
    }
});










你可能感兴趣的:(NodeJS 局域网收发文件)