精华内容
下载资源
问答
  • 安全文件传输与管理软件-仿FTP客户端(JAVA,Swing,RSA加解密,Mysql) 安全文件传输与管理软件-仿FTP客户端(JAVA,Swing,RSA加解密,Mysql)(毕业论文14345字以上,共36页,程序代码,MySQL数据库) 【运行环境】...

    安全文件传输与管理软件-仿FTP客户端(JAVA,Swing,RSA加解密,Mysql)

    安全文件传输与管理软件-仿FTP客户端(JAVA,Swing,RSA加解密,Mysql)(毕业论文14345字以上,共36页,程序代码,MySQL数据库)

    运行环境  NetBeans  JDK1.8  Tomcat8   MYSQL   FileZillaServer   FileZillaClient

    技术栈 JAVA   SWING   RSA加解密   MYSQL

    项目源码

    【项目包含内容

    image.png

    【文档包含内容】

    image.png

    【项目功能介绍】

    本系统实现以下基本功能:

    (1)系统具有简洁大方的界面,使用简便,友好的错误提示信息。

    (2)文件管理和文件传输。(使用Java中FTPClient类)

    (3)文件签名/认证,文件加密/解密。(使用RSA算法或其他)

     

    【数据库截图】

    image.png

     

    【代码截图】

    image.png

     

    【文档部分截图】

    image.png

     

    image.png

     

    image.png

    【项目运行截图】

    3.png2.png1.png

    展开全文
  • 框架:vue+jq ,Spring boot+maven ...--FTP上传下载--> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6&l...

    框架:vue+jq  ,Spring boot+maven

    pom:

    <!--FTP上传下载-->
      <dependency>
       <groupId>commons-net</groupId>
       <artifactId>commons-net</artifactId>
       <version>3.6</version>
      </dependency>
      <dependency>
       <groupId>fr.opensagres.xdocreport</groupId>
       <artifactId>org.apache.poi.xwpf.converter.core</artifactId>
       <version>1.0.6</version>
      </dependency>

    思路:将前端在线编辑的数据,通过ajax传递到后台,由后台生成Excel并且插入数据,再由ftp上传到指定位置

    前端:ZCell+jq

    如下图导入需要的js以及css

     

    HTML代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>PMS在线Excel编辑</title>
        <meta name="keywords" content="前端,excel,插件,ZCELL,智表,免费,jquery,浏览器,仿EXCEL,官网">
        <meta name="description" content="智表(ZCELL)是一款浏览器仿excel表格jquery前端插件。智表可以为你提供excel般的智能体验,支持双击编辑、设置公式、设置显示小数精度、下拉框、自定义单元格、复制粘贴、不连续选定、合并单元格、拆分单元格、插入行列、删除行列、隐藏行列、键盘操作等。">
        <meta name="author" content="智表研发团队">
        <meta name="copyright" content="智表研发团队版权所有">


        <script type="text/javascript" src="../../../lib/zcell/jquery.min.js"></script>
        <script type="text/javascript" src="../../../lib/zcell/ZCell.register.js"></script>
        <script type="text/javascript" src="../../../lib/zcell/ZCell.min.js"></script>
        <link rel="stylesheet" type="text/css" href="../../../lib/zcell/ZCell.css" />

        <style>

     .button {
                background-color: #4CAF50; /* Green */
                border: none;
                color: white;
                padding: 6px;
                text-align: center;
                text-decoration: none;
                display: inline-block;
                font-size: 12px;
                margin: 2px;
                -webkit-transition-duration: 0.4s; /* Safari */
                transition-duration: 0.4s;
                cursor: pointer;
            }

            .button1 {
                background-color: white;
                color: black;
                border: 2px solid #4CAF50;
            }

            .button1:hover {
                background-color: #4CAF50;
                color: white;
            }

            .button2 {
                background-color: white;
                color: black;
                border: 1px solid #008CBA;
            }

            .button2:hover {
                background-color: #008CBA;
                color: white;
            }

            .button3 {
                background-color: white;
                color: black;
                border: 2px solid #f44336;
            }

            .button3:hover {
                background-color: #f44336;
                color: white;
            }

            .button4 {
                background-color: white;
                color: black;
                border: 2px solid #e7e7e7;
            }

            .button4:hover {
                background-color: #e7e7e7;
            }

            .button5 {
                background-color: white;
                color: black;
                border: 2px solid #555555;
            }

            .button5:hover {
                background-color: #555555;
                color: white;
            }
        </style>
    </head>
    <body>

    <span>&nbsp;&nbsp;&nbsp;&nbsp;</span>


    <form id="form1" action="" method="post" enctype="multipart/form-data">
    <div id="cellContainer" style="width:1200px;height:650px;  border:1px solid #DDECFE; overflow:hidden;">
    </div>
    </form>
    <!--#include virtual="../../commons/commonJs.shtml"-->
    <!-- 本页面js -->
    <script type="text/javascript" src="../../../js/sys/user/user_excel_model.js"></script>
    </body>
    </html>

     

    //JS文件

    //页面加载时,执行
    var zcell1;

    //准备数据源
    var jsondata = [//四行五列
        // ["列1", "列2", "列3", "列4", "列5", "列6", "列7", "列8", "列9", "列10", "列11", "列12", "列13"],
        //如果需要从后台获取数据,接收数组参数

    ];
    var httpurl = httpurlSystem;

    //页面加载时执行
    $(document).ready(function () {
        //创建JSCELL,指明承载容器
        zcell1 = new ZCell(document.getElementById("cellContainer"));
        //创建表,并指定列,行数
        zcell1.InserSheet(0, 10, 24);

        //加载数据
        zcell1.GetSheet(0).LoadArrData(jsondata);


        zcell1.GetSheet(0).SetCellType(2, 22, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='comput()' style='border: solid 1px;'>实时计算</button>"
        });

        zcell1.GetSheet(0).SetCellType(3, 22, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='setcolw()' style='border: solid 1px;'>设置列宽</button>"
        });

    zcell1.GetSheet(0).SetCellType(4, 22, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='setrowh()' style='border: solid 1px;'>设置行高</button>"
        });

        zcell1.GetSheet(0).SetCellType(5, 22, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='setLabHidden()' style='border: solid 1px;'>隐藏标尺</button>"
        });

        zcell1.GetSheet(0).SetCellType(6, 22, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='setLabdisplay()' style='border: solid 1px;'>显示标尺</button>"
        });

        zcell1.GetSheet(0).SetCellType(7, 22, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='endedit()' style='border: solid 1px;'>退出编辑</button>"
        });

        zcell1.GetSheet(0).SetCellType(8, 22, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='getrccount()' style='border: solid 1px;'>获取行列数</button>"
        });

        zcell1.GetSheet(0).SetCellType(7, 23, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='getselcells()' style='border: solid 1px;'>获取选定格</button>"
        });

        zcell1.GetSheet(0).SetCellType(2, 23, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='getcor()' style='border: solid 1px;'>获取当前坐标</button>"
        });

        zcell1.GetSheet(0).SetCellType(3, 23, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='Getdata()' style='border: solid 1px;'>获取表数据</button>"
        });

        zcell1.GetSheet(0).SetCellType(4, 23, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='gettdval()' style='border: solid 1px;'>获取单元格值</button>"
        });

        // zcell1.GetSheet(0).SetCellReadOnly(5, 23, 1);// 设置只读属性,1 只读,0 非只读


        zcell1.GetSheet(0).SetCellType(6, 23, {
            "code": "button",
            "object": "<button type=\"button\" οnclick='hidestabar()' style='border: solid 1px;'>隐藏状态栏</button>"
        });


    });

    //自定义函数,公式中可以直接引用
    function GETARGS() {
        var vi = 0.23;

        return vi;
    }

    //获得数据
    function Getdata() {
        //获取当前数据的数组,可以黏贴后查看效果
        var datastr = zcell1.GetSheet(0).GetDataArr();
        alert("第6行5列单元格数据为:" + datastr[5][4]);

    }


    //获得单元格值
    function gettdval() {
        var val = zcell1.GetSheet(0).GetCellValue(6, 7);

        alert("第6列7行单元格值为:" + val);
    }

    //设置标签隐藏
    function setLabHidden() {
        //设置列\行标签不显示
        zcell1.GetSheet(0).ShowColLab(0);
        zcell1.GetSheet(0).ShowRowLab(0);
    }

    //设置标签显示
    function setLabdisplay() {
        //设置列\行标签不显示
        zcell1.GetSheet(0).ShowColLab(1);
        zcell1.GetSheet(0).ShowRowLab(1);
    }

    //设置列宽
    function setcolw() {
        zcell1.GetSheet(0).SetColWidth(3, 200);
    }

    //设置行高
    function setrowh() {
        zcell1.GetSheet(0).SetRowHeight(16, 50);
    }

    function comput() {
        alert("选定数值单元格后,可以在智表下方查看实时计算结果");

    }

    //获取当前单元格
    function getcor() {
        var str1 = "当前列号:" + zcell1.GetSheet(0).GetCurrentColNo() + ",行号:" + zcell1.GetSheet(0).GetCurrentRowNo();
        alert(str1);
    }

    //获取表 行数,列数
    function getrccount() {
        var str1 = "总列数:" + zcell1.GetSheet(0).GetCols() + ",总行数:" + zcell1.GetSheet(0).GetRows();
        alert(str1);
    }

    //获取选定单元格,返回JSON串
    function getselcells() {

        alert(zcell1.GetSheet(0).GetSelectCellsJson());
    }

    //保存并退出编辑状态FTP上传函数
    function endedit() {
        var datastr = zcell1.GetSheet(0).GetDataArr();  //获取Excel页面所有数据,且数据为二维数组(重要)
        // zcell1.SaveEdit();
        $.ajax({
            url: httpurl+'user/ftpUpload?token='+TokenUtils.getToken(),
            type: "POST",
            contentType : "application/json" ,
            data : JSON.stringify(datastr),  //把二维数组转换成json字符串
            traditional: true,
            success:function (data) {
                alert(data)
            },
            error:function (data,index) {
                alert(data)
            }
        })

    }

    function editdata() {

        alert("我是ZCELL自定义编辑事件");
        return;

    }
    function summitfun() {

        alert("我是ZCELL自定义按钮触发事件");

    }

    function hidestabar() {
        zcell1.SetStatusBar(0);
    }

    //合并单元格
    function merge() {
        //合并单元格
        zcell1.GetSheet(0).MergeCells(2, 4, 2, 5);
        zcell1.GetSheet(0).MergeCells(3, 4, 3, 5);
        zcell1.GetSheet(0).MergeCells(4, 4, 6, 4);

    }

    //取消合并单元格
    function unmerge() {
        zcell1.GetSheet(0).SplitCell(2, 4);
        zcell1.GetSheet(0).SplitCell(3, 4);
        zcell1.GetSheet(0).SplitCell(4, 4);
    }

    //控制层核心函数

    /**
      * ftp 文件上传
      */
     @RequestMapping("/ftpUpload")
     @ResponseBody
     @RequiresPermissions("user:list")
     public void ftpUpload(@RequestBody(required=false) List<List<String>> arr,HttpServletResponse res, HttpServletRequest request)throws IOException {

    //后台接受参数要用list泛型来接受前台的二维数组
      // 创建一个excel文件
      HSSFWorkbook book = new HSSFWorkbook();
      // 创建Sheet对象
      HSSFSheet sheet = book.createSheet("测试");

      HSSFRow row = null;
      HSSFCell cell = null;
      int rowIndex = 0;
      for(int j=0;j<=arr.size()-1;j++){
       row= sheet.createRow(rowIndex);
       for(int k=0;k<arr.get(j).size();k++){
         cell =  row.createCell(k);
         cell.setCellValue(arr.get(j).get(k));
       }
       rowIndex++;
      }
      FTPClient ftp = new FTPClient();
      try {
       // 连接ftp服务器    ftp.connect("ip", 端口);
       ftp.connect("127.0.20.41", 21);
       // 登录
       ftp.login("username", "password");
       // 设置上传路径
       String path = "/xx";
       // 检查上传路径是否存在 如果不存在返回false
       boolean flag = ftp.changeWorkingDirectory(path);
       System.out.println(flag);
       if (!flag) {
        // 创建上传的路径 该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建image
        ftp.makeDirectory(path);
        System.out.println("11");
       }
       // 指定上传路径
       ftp.changeWorkingDirectory(path);
       // 指定上传文件的类型 二进制文件
       ftp.setFileType(FTP.BINARY_FILE_TYPE);
       ByteArrayOutputStream os = new ByteArrayOutputStream();
       book.write(os);
       byte[] b = os.toByteArray();
       ByteArrayInputStream in = new ByteArrayInputStream(b);
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd");
       Date date = new Date();
       String name = new String(("测试_" + sdf.format(date) + ".xls").getBytes("GBK"), "iso-8859-1");//涉及到中文问题 根据系统实际编码改变
       ftp.storeFile(name, in);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }

    写在最后,本人只是为自己做记录,如有需要以及不解处请留言,我会及时回复

    展开全文
  • 断点续传德兴馆技术,HTTP FTP等下载软件
  • 技术选型 corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会向服务端发送数据,服务器端向客户端传输数据 网络(Socket编程) 通过网络获取客户端的数据以及通过网络给客户传输信息 ubuntu(云服务器) 软件通常...

    模拟web服务器 9.7 9.8

    1.项目开发流程

    提出需求<->评估需求->评估工作量-》ui设计-》前后端分离开发-》联调-》发布上线-》运维监控

    2.项目介绍

    web服务器

    一般指网络服务器,是指驻留于英特网上某种类型计算机的程序、可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的丧Web服务器是Apache。Nginx、IIs。

    例如:百度服务器。

    模拟WEB服务器就是开服一个类似Apache Tomcat一样的服务器软件

    3.技术选型

    • corejava
      • 线程池 同任务并发执行
      • IO流 传递数据 客户端也会向服务端发送数据,服务器端向客户端传输数据
      • 网络(Socket编程) 通过网络获取客户端的数据以及通过网络给客户传输信息
    • ubuntu(云服务器)
      • 软件通常部署在linux下

    4.软件架构

    4.1 C/S架构

    C/S(Client/Server),即客户端/服务端架构。

    服务器端有种:

    • 一种是数据库服务器端
    • 另一种是Socket服务端

    优点:

    • 界面和操作可以很丰富
    • 安全性能可以很容易保证,实现多层认证也可以
    • 由于只有一层交互,因此响应速度较快

    缺点:

    • 适用面窄
    • 用户群固定。使用需要安装客户端
    • 维护成本高。一次升级所有客户端都要升级

    4.2 B/S架构

    B/S 即浏览器/服务器架构,B/S架构的软件无须特别安装,只要有Web浏览器即可。

    B/S架构中,显示逻辑交给了Web浏览器,事务处理逻辑放在了服务器上,这样就避免了庞大的浏览器。

    这个架构采用的是HTTp协议进行数据交互,且是请求-响应模型通信

    5.HTTP协议

    5.1HTTP协议介绍

    • HTTP 超文本传输协议

    • HTTP是基于TCP/IP通信协议来传递数据(HTML文件、图片文件)

    • HTTP是一个属于应用层的面向对象的协议

    • HTTP协议工作于客户端-服务端架构上,基于请求响应模型

    • HTTP协议是无状态访问的

    HTTP是一种不保存状态,即无状态协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。

    也就是说在HTTP这个级别不做通信的持久化处理。

    5.2访问方式

    HTTP中定义了八种方法来以不同方式操作指定的资源

    GET HEAD POST PUT DELETE TRACE OPTIONS CONNECT

    目前常用的浏览器只支持GET、POST请求方式

    客服端对服务端的资源操作方式有多种:

    • 增加 POST
    • 浏览 GET
    • 修改 PUT
    • 删除 DELETE

    6.HTTP访问信息解析

    6.1请求

    GET

    GET /index HTTP/1.1 --------请求方式 /请求内容 协议/版本号------请求行
    Host: 127.0.0.1:8888 ---------访问的端口地址
    Connection: keep-alive ----------访问方式
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 ------------客户端基本信息
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 ---------浏览器能接收的数据类型
    Sec-Fetch-Site: none
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Accept-Encoding: gzip, deflate, br -----------能接收的编码
    Accept-Language: zh-CN,zh;q=0.9 ------------能接收的语言

    POST

    请求行 请求方式 /请求内容 协议/版本号

    请求头 key: value

    ​ Content-Length:发送过来的请求数据的长度

    空行

    请求体

    存放post请求发送的数据

    6.2响应

    HTTP/1.1 StateCode desc

    Content-Type:

    7.服务器编写

    通过封装可以完成服务器的编写

    一共封装了三类七个类

    pojo类

    Request 类

    Request 对用户的请求进行封装 只对请求资源信息进行保存

    package com.unvoid.server.pojo;
    
    import java.io.Serializable;
    
    public class Request  implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private String sourceHead;
        private String sourcetail;
    
        public Request(String sourceHead, String sourcetail) {
            this.sourceHead = sourceHead;
            this.sourcetail = sourcetail;
        }
    
        public String getSourceHead() {
            return sourceHead;
        }
    
        public String getSourcetail() {
            return sourcetail;
        }
    }
    
    

    Response 类

    Response 对响应行 响应头进行封装

    package com.unvoid.server.pojo;
    
    import com.unvoid.server.util.StateCode;
    
    import java.io.Serializable;
    import java.util.Map;
    
    public class Response implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private String agreement = "HTTP/1.1";
        private StateCode stateCode;
        private Map<String,String> map;
    
        public Response(StateCode stateCode, Map<String, String> map) {
            this.stateCode = stateCode;
            this.map = map;
        }
    
        public String getAgreement() {
            return agreement;
        }
    
        public StateCode getStateCode() {
            return stateCode;
        }
    
        public Map<String, String> getMap() {
            return map;
        }
    }
    
    

    util类

    StateCode 类

    StateCode enum类 枚举了常见的响应状态

    package com.unvoid.server.util;
    
    public enum StateCode {
        SUCCESS(200,"SUCCESS"),NOT_FOUND(404,"NOT FOUND"),ERROR(500,"ERROR");
    
        private int code;
        private String desc;
    
        StateCode(int code, String desc) {
            this.code = code;
            this.desc = desc;
        }
    
        @Override
        public String toString() {
            return code+" "+desc;
        }
    }
    

    TypeMap 类

    TypeMap 保存响应体对应类型设置

    package com.unvoid.server.util;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class TypeMap {
        public static final Map<String,String> map;
        static {
            map=new HashMap<>();
            map.put(".html","text/html");
            map.put(".pdf","application/pdf");
            map.put(".jpg","image/jpeg");
            map.put(".png","image/png");
        }
    }
    

    ServerUtil 类

    ServerUtil 工具类直接获取request和response

    package com.unvoid.server.util;
    
    import com.unvoid.server.pojo.Request;
    import com.unvoid.server.pojo.Response;
    
    import java.io.*;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Map;
    
    public class ServerUtil {
        public static Request getRequest(Socket socket) throws IOException {
            BufferedReader br =
                    new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = br.readLine();
            line=line.substring(line.indexOf(" "),line.lastIndexOf(" "));
            //System.out.println(line);
            String resourceHead;
            String resourceTail;
            if (line.lastIndexOf(".")>0) {
                resourceHead=line.substring(line.lastIndexOf("/")+1,line.lastIndexOf("."));
                resourceTail=line.substring(line.lastIndexOf("."),line.length());
    
            }else {
                return new Request("index",".html");
            }
            socket.shutdownInput();
            return new Request(resourceHead,resourceTail);
        }
        public static Response getResponse(Request request){
            StateCode stateCode;
            Map<String,String> map =new HashMap<>();
            String fileName = request.getSourceHead()+request.getSourcetail();
            File file =new File("resource",fileName);
            if (file.exists()){
                stateCode=StateCode.SUCCESS;
                map.put("Content-Type",TypeMap.map.get(request.getSourcetail()));
    //            map.put("Content-Encoding","utf-8");
            }else {
                stateCode=StateCode.NOT_FOUND;
                map.put("Content-Type",TypeMap.map.get(".html"));
            }
            return new Response(stateCode,map);
        }
    }
    

    ServerDoUtil 类

    ServerDoUtil 主要工作的工具类 里面的线程池接到任务就开始工作

    package com.unvoid.server.util;
    
    import com.unvoid.server.pojo.Request;
    import com.unvoid.server.pojo.Response;
    import sockettest.Server;
    
    import java.io.*;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ThreadPoolExecutor;
    
    public class ServerDoUtil {
        private static final ExecutorService pool;
        static {
            pool=Executors.newCachedThreadPool();
        }
        public static void serverDo(Socket socket) {
              pool.execute(()->{
                  try {
                      Request request = ServerUtil.getRequest(socket);
                      Response response =ServerUtil.getResponse(request);
                      File file =new File("resource",request.getSourceHead()+request.getSourcetail());
                      BufferedOutputStream bos =
                              new BufferedOutputStream(socket.getOutputStream());
                      BufferedInputStream bis;
                      System.out.println(file.exists());
                      if (file.exists()){
                           bis =
                                  new BufferedInputStream(new FileInputStream(file));
                      }else {
                          file = new File("resource/404.html");
                           bis =
                                  new BufferedInputStream(new FileInputStream("resource/404.html"));
                      }
                      System.out.println(file.getName());
                      System.out.println(file.exists());
                      bos.write(response.getAgreement().getBytes());
                      bos.write(" ".getBytes());
                      bos.write(response.getStateCode().toString().getBytes());
                      bos.write("\n".getBytes());
                      bos.write("Content-Type: ".getBytes());
                      bos.write(response.getMap().get("Content-Type").getBytes());
                      bos.write("\n".getBytes());
                      bos.write("\n".getBytes());
                      int count = -1;
                      byte[] bytes = new byte[1024];
                      while ((count = bis.read(bytes))!=-1){
                          bos.write(bytes,0,count);
                      }
                      bos.flush();
                      bos.close();
                      socket.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              });
    
        }
    }
    

    application类

    Application 主函数入口

    package com.unvoid.server.application;
    
    import com.unvoid.server.util.ServerDoUtil;
    import sockettest.Server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Application {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(80);
            while (true){
                Socket socket = ss.accept();
                ServerDoUtil.serverDo(socket);
            }
        }
    }
    

    8.遇到的问题与解决

    在进行这个项目的时候遇到了一个令我困惑的问题就是一次浏览器的访问 后台会收到两次请求,例如:

     try {
                ServerSocket ss = new ServerSocket(8888);
                while (true){
                    Socket socket = ss.accept();
                    System.out.println("收到请求");
                }
            } catch (IOException e) {
                System.out.println("服务器内部错误:"+e.getMessage());
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    一个简简单单的测试代码,然后使用服务器访问127.0.0.1:8888时 后台会打印两个“收到请求”

    使用谷歌浏览器时多出来的一个请求是空请求,用QQ浏览器时就会发现多出来的一个请求为

    GET /favicon.ico HTTP/1.1

    后来经过查询得知这是浏览器秘密发送的请求,是浏览器自带的机制,会自动的向服务器发出这样的图片请求。以做搜藏。

    所以写代码时需要对这类请求进行处理拦截/忽略等。

    9.项目打包及部署

    使用ftp命令进行文件上传

    1. 连接ftp服务器

    格式:ftp [hostname| ip-address]
    a)在linux命令行下输入:

    ftp 192.168.1.1

    b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。

    2. 下载文件

    下载文件通常用get和mget这两条命令。
    a) get
    格式:get [remote-file] [local-file]
    将文件从远端主机中传送至本地主机中。
    如要获取远程服务器上/usr/your/1.htm,则

    ftp> get /usr/your/1.htm 1.htm (回车)

    3.上传文件

    a) put
    格式:put local-file [remote-file]
    将本地一个文件传送至远端主机中。
    如要把本地的1.htm传送到远端主机/usr/your,并改名为2.htm

    ftp> put 1.htm /usr/your/2.htm (回车)

    搞了半天忘记了之前ftp的用户名密码 结果随便试了下 发现就是ftp ftp。。。。

    运行程序

    上传了之后 就可以运行jar包了

    java -jar filename.jar

    如果想让程序在后台一直运行 可以在使用命令

    nohup java -jar filename.jar &

    这样程序就在后台自动执行,且在当前目录创建一个名为nohup.out ,控制台的输出会全部输出到nohup.out。

    nohup.out就可以充当日志

    使用命令cp /dev/null nohup.out 可以在不关闭程序的情况下清空nohup.out

    关闭程序

    运行后可以使用ps -ef|grep java 命令来查看当前运行的java程序的pid

    之后就可以使用kill pid 的方式来关闭想要关闭的java程序

    展开全文
  • 为了实现这个功能,我们需要用到如下软件,Java+FlexPaper+SwfTool+OpenOffice这四大件.

    为了实现这个功能,我们需要用到如下软件,Java+FlexPaper+SwfTool+OpenOffice这四大件.

    1、思路

    我们将doc、ppt等文档格式通过openoffice转换成pdf的格式,然后用SWFTool工具将pdf切分成小块的swf文件或者大型的swf文件或者图片格式也行.一般都采用小块swf或者小块图片格式,这样用户就能按需加载.比如我们的pdf文件有80M,用户打开预览页面加载的就是当前查看页的前一页、当前页、后一页,当然这数字是可以通过调整配置去设置.所以用户可以很快的去打开页面进行预览而不是加载一个整体的文件.

    2、环境的安装

    1.安装OpenOffice,官网下载地址:下载地址,我是使用的最新版.具体安装方法自行百度.

    2.启动OpenOffice服务,CMD命令进入OpenOffice安装目录下的program目录,键入如下命令

    /opt/openoffice4/program/soffice “-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager” -nologo -headless -nofirststartwizard &

    这个是启动office后台进行转换的一个服务,无图形界面.

    3.下载JODConverter:下载地址,项目中主要使用lib目录下的jar包。

    4.下载并安装SWFTools:下载地址,下载exe文件安装完成即可

    5.下载FlexPlayer

    下载地址

    未使用最新版,使用1.5.1

    6.下载相关的xpdf及字符集(处理中文文档字体的错误)

    xpdf-3.02pl5-win32.zip
    下载地址为
    ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl5-win32.zip
    xpdf-chinese-simplified.tar.gz
    下载地址为
    ftp://ftp.foolabs.com/pub/xpdf/xpdf-chinese-simplified.tar.gz
    也可以去http://www.foolabs.com/xpdf/download.html查找你自己需要的字符集

    您也可以去官网下载最新版本

    1.解压xpdf-3.02pl5-win32.zip,解压后修改名称为xpdf,并将其考到c盘根目录下【路径可以随意指定,但是执行pdf2swf指令时要指定到当前目录】。
    2.解压xpdf-chinese-simplified,将xpdf-chinese-simplified放置xpf目录下
    3.修改xpdf-chinese-simplified目录下的add-to-xpdfrc文件

    Add-to-xpdfrc代码

    #----- begin Chinese Simplified support package (2004-jul-27)  
    cidToUnicode        Adobe-GB1         /usr/local/share/xpdf/chinese-simplified/Adobe-GB1.cidToUnicode   
    unicodeMap            ISO-2022-CN    /usr/local/share/xpdf/chinese-simplified/ISO-2022-CN.unicodeMap   
    unicodeMap    EUC-CN        /usr/local/share/xpdf/chinese-simplified/EUC-CN.unicodeMap   
    unicodeMap    GBK     /usr/local/share/xpdf/chinese-simplified/GBK.unicodeMap   
    cMapDir     Adobe-GB1    /usr/local/share/xpdf/chinese-simplified/CMap   
    toUnicodeDir  /usr/local/share/xpdf/chinese-simplified/CMap   
    fontDir C:\WINDOWS\Fonts   
    #添加字体格式
    displayCIDFontTT Adobe-GB1 /usr/local/share/xpdf/chinese-simplified/Fonts/simhei.ttf   
    #displayCIDFontTT   Adobe-GB1   /usr/..../gkai00mp.ttf  
    #----- end Chinese Simplified support package

    如果您未注释掉下面提供的类中的languagedir段,则会在转换的时候显示如下信息
    表示成功添加了中文字体
    输出信息

    3.开发过程

    1.添加JODConverter的jar包,同时也需要将所依赖的包添加进工程.

    2.咱们需要一个转换的类

    public class Converter2Swf {
        private File pdfFile;
        private File swfFile;
        private File docFile;
        private File originalFile;
        private static final String[] extArray = {"doc","docx","ppt","pptx","xls","xlsx","txt","rtf"};
    
        public Converter2Swf(String fileString) {
            init(fileString);
        }
    
        /*
         * 重新设置 file @param fileString
         */
        public void setFile(String fileString) {
            init(fileString);
        }
    
        /*
         * 初始化 @param fileString
         */
        private void init(String fileString) {
            originalFile = new File(fileString);
            String fileName = FilenameUtils.getBaseName(fileString);
            String fileExt = FilenameUtils.getExtension(fileString);
    
            if (Converter2Swf.can2Pdf(fileExt)) {
                docFile = new File(fileString);
                pdfFile = new File(fileName + ".pdf");
                swfFile = new File(fileName+new Date().getTime() + ".swf");
            } else if ("pdf".equals(fileExt)) {
                pdfFile = new File(fileString);
                swfFile = new File(fileName+new Date().getTime() + ".swf");
            }
        }
    
        public static boolean can2Pdf(String ext) {
            for (String temp : extArray) {
                if(temp.equals(ext))
                    return true;
            }
            return false;
        }
    
        public static boolean can2Swf(String ext) {
            if("pdf".equals(ext))
                return true;
            for (String temp : extArray) {
                if(temp.equals(ext))
                    return true;
            }
            return false;
        }
    
        /*
         * 转为PDF @param file
         */
        private void doc2pdf() throws Exception {
            OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
            connection.connect();
            DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
            converter.convert(docFile, pdfFile);
            connection.disconnect();
        }
    
        /*
         * 转换成swf
         */
        private int pdf2swf() throws Exception {
            int countFile = -1;
            int errorFlag = 0;
            String path = File.separator+FilenameUtils.getPath(swfFile.getPath());
            String filename = FilenameUtils.getBaseName(swfFile.getPath()) + "%." + FilenameUtils.getExtension(swfFile.getPath());
            String[] command = {"pdf2swf", pdfFile.getPath(), "-o", path + filename, "-T 9","-s","languagedir=/usr/local/share/xpdf/chinese-simplified"};
            ProcessBuilder proc = new ProcessBuilder(command);
            proc.redirectErrorStream(true);
            Process p = proc.start();
            String outlog = loadStream(p.getInputStream());
            if(StringUtils.contains(outlog,"FATAL"))
                errorFlag = 2;
            else if(StringUtils.contains(outlog,"ERROR"))
                errorFlag = 1;
            if(errorFlag == 1)
                System.err.println(outlog);
            else if (errorFlag == 2) {
                System.err.println(outlog);
                countFile = 0;
            } else {
                System.out.println(outlog);
                countFile = StringUtils.countMatches(outlog, FilenameUtils.getBaseName(pdfFile.getName()));
            }
            if (pdfFile.exists() && !pdfFile.getPath().equals(originalFile.getPath())) {
                pdfFile.delete();
            }
            return countFile;
        }
    
        static String loadStream(InputStream in) throws IOException {
            int ptr = 0;
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder buffer = new StringBuilder();
            while ((ptr = reader.read()) != -1) {
                buffer.append((char) ptr);
            }
            return buffer.toString();
        }
    
        /*
         * 转换主方法
         */
        public int conver() throws Exception {
            int countFile = -1;
            if (swfFile != null) {
                if (docFile != null && can2Pdf(FilenameUtils.getExtension(docFile.getPath())))
                    doc2pdf();
                if(pdfFile != null && can2Swf(FilenameUtils.getExtension(pdfFile.getPath())))
                   countFile = pdf2swf();
            }
            return countFile;
        }
    
        /*
         * 返回文件路径 @param s
         */
        public String getswfPath() {
            if (swfFile.exists()) {
                String tempString = swfFile.getPath();
                tempString = tempString.replaceAll("\\\\", "/");
                return tempString;
            } else {
                return "";
            }
        }
    
        /*
         * 设置输出路径
         */
        public void setOutputPath(String outputPath) {
            File output = new File(outputPath);
            if(!output.exists())
                output.mkdirs();
            if (!outputPath.equals("")) {
                if (outputPath.charAt(outputPath.length() - 1) == '/') {
                    swfFile = new File(outputPath + FilenameUtils.getBaseName(swfFile.getPath()) + ".swf");
                } else {
                    swfFile = new File(outputPath + File.separator + FilenameUtils.getBaseName(swfFile.getPath()) + ".swf");
                }
            }
        }
    
        public File getSwfFile() {
            return swfFile;
        }
    
        public static void main(String s[]) {
            File file = new File("/home/michael/06142722_m3Sr.pdf");
            Converter2Swf d = new Converter2Swf(file.getPath());
            d.setOutputPath(RequestContext.root());
            int swfcount = 0;
            try {
                swfcount = d.conver();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    该类只是单独对文件进行转换成pdf swf,可以在用户上传的时候进行对文件的处理,也可以在用户上传完之后通过一定定时任务去处理,这样用户就不需要为了等待服务器的转换而浪费时间.该代码是建立在linux基础上进行,如果您是要在window上进行处理则要稍稍修改代码
    该代码这里进行切分是按页切分成小型的swf文件
    如果不需要则command中的-T 9则行
    该代码引入了中文字体库,否则在进行转换成swf的时候可能会出现一些缺少中文字体等错误,如果您不需要处理这种中文的错误,您也可以在command中去掉
    languagedir=/usr/local/share/xpdf/chinese-simplified
    通过执行这个类的main方法可以测试是否成功生成swf文件
    3.如果您已经成功产生了如上的swf文件,则可以进行最后一步,在页面上调用FlexPaperViewer的swf文件显示就可以
    <script type="text/javascript">
                var fp = new FlexPaperViewer(
                        '/js/flexpaper/FlexPaperViewer',
                        'viewerPlaceHolder', { config : {
                            SwfFile : '{$doc.swfurl(),$doc.swfcount()}',
                            Scale : 0.6,
                            ZoomTransition : 'easeOut',
                            ZoomTime : 0.5,
                            ZoomInterval : 0.2,
                            FitPageOnLoad : false,
                            FitWidthOnLoad : true,
                            FullScreenAsMaxWindow : false,
                            ProgressiveLoading : true,
                            MinZoomSize : 0.2,
                            MaxZoomSize : 5,
                            SearchMatchAll : false,
                            InitViewMode : 'Portrait',
    
                            ViewModeToolsVisible : true,
                            ZoomToolsVisible : true,
                            NavToolsVisible : true,
                            CursorToolsVisible : true,
                            SearchToolsVisible : true,
    
                            localeChain: 'zh_CN'
                        }});
            </script>

    这部分代码不同版本的flexpaper会稍有不同,具体细节参考官网的文档说明,如果您用的最新版的flexpaper,可能这样的配置或者调用方式有些不同.

    $doc.swfurl()是代码的swf的url地址,而后面的$doc.swfcount()代表该文件转换成功生成的swf小文件个数.
    需要注意的是我们的这个swfurl()方法返回的链接是必须不能带有空格之类的,所以我们在转换生成swf文件的时候最好采用时间来作为文件命名的一个参照,这样就能避免出现空格的问题,同时对于大规模的部署这个应用,我们还得处理在Linux上,一个目录下文件不能超过10000个文件,所以我们可以分成大大小小的目录去处理.

    最后的效果可以参考

    效果演示

    原文地址
    http://www.devh.net/u/yidongnan/blog/read-the-document-implemented-in-java-imitation-online
    展开全文
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...
  • 本篇针对校园网进行仿真设计,主要分为VLAN划分,路由,防火墙,web服务器,dns服务器,email服务器,无线网络及ftp服务器配置的参数设计。 1 VLAN划分 2 IP地址划分 各子网内pc配置如下 路由器及端口配置如下 ...
  • 《传智播客:2.3/spring/jdbc/EJB3.0/ajax/hibernate/Struts/java视频教程》(SPRING2.5/AJAX/JAVA/JNI/FTP/AJAX/ibatis/OA/JDBC) 电驴资源下面是用户共享的文件列表,安装电驴后,您可以点击这些文件名进行下载传智...
  • geekOnce a week we dig into our reader mailbag and answer your burning ... Today we’re taking a peek at how to enable the missing FTP functionality in XBMC, rename your downloaded TV shows, and...
  • 本篇为该设计最终篇。最终设计成的总拓扑图如下。 仿真完成后需进行功能测试。 1 PC 连通性 ...在 学 生 端 电 脑 上 采 用 ping 命 令 测 试 TEST-PC1 及...说明 ftp 服务器配置成功,可实现校内各区的资源共享。
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...
  • 校园网内设 web 服务器、DNS 服务器、M-mail 服务器、FTP 服务器;使用 ACL 访问控制列表为校园网提供防火墙,并通过 NAT 转换实现与外网之间的通信;无线上网功能。 中心机房设置一台核心交换机,负责整个校园网...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...
  • HAHA CHAT Java仿QQ聊天程序源代码.rar html 标记大全.rar iCHAT聊天室基于Java.rar IP定位器.rar J2ME优化压缩PNG文件.rar J2ME冒险游戏CASPER源代码.rar J2me月光战机游戏源码.rar J2ME黑白棋游戏手机版 v2.1完整...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • Java资源包01

    2016-08-31 09:16:25
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包101

    2016-07-13 10:11:08
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包2

    热门讨论 2013-06-28 09:17:39
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包3

    热门讨论 2013-06-28 09:20:52
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • 搭建ftp

    2018-10-08 16:07:39
    freeweb ... Linux下ftp服务可以通过搭建vsftpd服务来实现,以CentOS为例,首先查看系统中是否安装了vsftpd,可以通过执行命令 rpm -qa | grep vsftpd 来查看是否安装相应的包,如果没有安...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包5

    热门讨论 2013-06-28 09:38:46
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包4

    热门讨论 2013-06-28 09:26:54
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包8

    热门讨论 2013-06-28 09:55:26
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
  • java开源包9

    热门讨论 2013-06-28 09:58:55
    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,019
精华内容 1,207
关键字:

java仿ftp

java 订阅