博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SocketIo+SpringMvc实现文件的上传下载
阅读量:6345 次
发布时间:2019-06-22

本文共 4819 字,大约阅读时间需要 16 分钟。

SocketIo+SpringMvc实现文件的上传下载

socketIo不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示:

img_ddd981374a8007744efedf3a99f9495c.gif
image

GIT地址:

部分代码如下:

服务端的代码:

ChuanServer:

import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.nio.channels.FileChannel;public class ChuanServer {    public static void protServer(String po) throws IOException {              int port = Integer.parseInt(po);        ServerSocket serverSocket = new ServerSocket(port);        while (true) {            final Socket clientSocket = serverSocket.accept();            new Thread() {                @Override                public void run() {                    try {                        BufferedReader br = new BufferedReader(                                new InputStreamReader(clientSocket.getInputStream(), "GBK")                        );                        InputStream is = clientSocket.getInputStream();                        PrintStream pr = new PrintStream(                                clientSocket.getOutputStream()                        );                        pr.println("我是服务端");                        String str = br.readLine();                        System.out.println("br.readLine():" + str);                        System.out.println("服务端来接收了!!");                        out(is, str);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }.start();        }    }    public static void out(InputStream is, String str) throws IOException {        FileOutputStream fo = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\upload\\" + str);        BufferedInputStream bi = new BufferedInputStream(is);        BufferedOutputStream bo = new BufferedOutputStream(fo);        int len = 0;        while ((len=bi.read())!=-1){            bo.write(len);        }        bi.close();        bo.close();    }}

这里我固定了上传后保存的路径为:"C:\Users\Administrator\Desktop\upload\"

PortController:

import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import socket.ChuanServer;import java.io.IOException;@Controllerpublic class PortController {    @RequestMapping("/port")    public  String port(String port,Model model){        model.addAttribute("port",port);        try {            ChuanServer.protServer(port);        } catch (IOException e) {            e.printStackTrace();        }        return "success";    }}
再来看下上传的客户端的代码:

UpLoadController:

@Controller@RequestMapping("/")public class UpLoadController {    @Autowired    private UpService upService;    private String zhuan="";    @RequestMapping("/upload")    public String upload(@RequestParam(value = "file", required = false) MultipartFile file,                         HttpServletRequest request, @RequestParam("iphost") String iphost,@RequestParam("port") String port,Model model) throws IOException {        String fileName = file.getOriginalFilename();        InputStream is = file.getInputStream();        upService.upload(fileName,is,iphost,port);        return "success";    }}

UpServiceImpl:

@Servicepublic class UpServiceImpl  implements UpService {    @Override    public void upload(String fileName, InputStream is, String iphost, String port) {        getClientSocket(is, fileName, iphost, port);    }//建立socket通信    public void getClientSocket(InputStream is, String fileName, String iphost, String port) {        int po = Integer.parseInt(port);        try {            Socket socket = new Socket(iphost, po);            BufferedReader br = new BufferedReader(                    new InputStreamReader(socket.getInputStream(), "UTF-8")            );            PrintStream pr = new PrintStream(                    socket.getOutputStream()            );            OutputStream os = socket.getOutputStream();            System.out.println("客户端给你传文件了!");            System.out.println("文件名为:" + fileName);            //读取服务器返回的消息            String str = br.readLine();            System.out.println("服务器发来的消息为:" + str);            pr.println(fileName);            in(is, os);            pr.close();            br.close();            System.out.println("客户端已关闭");        } catch (Exception e) {            e.printStackTrace();        }    }    //上传文本    public static void in(InputStream is, OutputStream os) throws IOException {        //BIO        BufferedInputStream bi = new BufferedInputStream(is);        BufferedOutputStream bo = new BufferedOutputStream(os);        int len = 0;        while ((len=bi.read())!=-1){            bo.write(len);            System.out.println(len);        }        bi.close();        bo.close();    }}
这里相应的访问路径为:

服务端:

客户端:

完整项目GIT地址:

注意:

传输过程中的我们用的是系统提供的BufferedInputStream和BufferedOutputStream缓冲流来传输文件,相对而言传输小文件比较合适,大文件比较慢,可以进一步优化,传输过程中传输速度如下:

img_900696dbb322ae6f8466d4dfbd33f463.gif
image

转载地址:http://xcjla.baihongyu.com/

你可能感兴趣的文章
《企业云桌面实施》-小技巧-03-vSAN6.5中SAS和SSD的使用建议
查看>>
Powershell统计邮箱账户信息
查看>>
工作汇报神技!用Python三步生成带有图表的word报表
查看>>
SFB 项目经验-48-去死吧,天天让人烦的垃圾邮件
查看>>
买《Python从小白到大牛》专题视频课程,送配套纸质图书
查看>>
puppet kick 报错返回值code3 求解答(finished with exit code 3)
查看>>
Windows Server 2012的服务管理自动化
查看>>
薛蛮子入局,EOS超级节点竞争进入白热化
查看>>
微博变种与RSS变种,互联网营销
查看>>
WCF开发框架形成之旅--WCF应用常见问题处理
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图
查看>>
什么是代理服务器
查看>>
二叉排序树经典算法速成
查看>>
可判断焦点是否停在输入窗口
查看>>
JRuby-Rack
查看>>
Warbler, A Little Birdie To Introduce Your Rails App To Java
查看>>
C#窗体控件-分组框控件GroupBox
查看>>
生成随机数
查看>>
POJ 2996 Help Me with the Game(水模拟)
查看>>
c# 动态挂截事件
查看>>