SocketIo+SpringMvc實現檔案的上傳下載
阿新 • • 發佈:2019-02-05
socketIo不僅可以用來做聊天工具,也可以實現區域網(當然你如果有外網也可用外網)內實現檔案的上傳和下載,下面是程式碼的效果演示:
GIT地址: https://github.com/fengcharly/sockeio-springMvcUpload.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; @Controller public 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:
@Service
public 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();
}
}
這裡相應的訪問路徑為:
服務端:http://localhost:8080/
客戶端:http://localhost:8082/upload
完整專案GIT地址:
注意: https://github.com/fengcharly/sockeio-springMvcUpload.git
傳輸過程中的我們用的是系統提供的BufferedInputStream和BufferedOutputStream緩衝流來傳輸檔案,相對而言傳輸小檔案比較合適,大檔案比較慢,可以進一步優化,傳輸過程中傳輸速度如下: