socketio不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示:
git地址: https://github.com/fengcharly/sockeio-springmvcupload.git
部分代码如下:
服务端的代码:
chuanserver:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
@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缓冲流来传输文件,相对而言传输小文件比较合适,大文件比较慢,可以进一步优化,传输过程中传输速度如下:
总结
以上所述是小编给大家介绍的socketio+springmvc实现文件的上传下载功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/charlypage/p/9440226.html