该项目实现的功能为:让客户端从本地上传一个文件给服务器,服务器接接收到文件数据后,在上传到本地。并且服务器一直处于监听状态,所以客户端可以一直上传文件。这里使用到了多线程,可以提高效率
首先先创建一个客户端
package Demo03_文件上传案例的优化;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class Demo01_Socket {
public static void main(String[] args) throws IOException{
//读取本地文件并上传给服务器
Socket socket = new Socket("127.0.0.1",888);
//为了上传效率,这里使用了缓冲流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\File\\1.jpg"));
OutputStream os = socket.getOutputStream();
int len =0;
byte[] bytes = new byte[1024];
while((len = bis.read(bytes)) != -1){
os.write(bytes,0,len);
}
//调用socket中的shutdownOutput(),否则程序进入死循环
socket.shutdownOutput();
//接受服务器的回复
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
char[] charArr = new char[1024];
while((len = isr.read(charArr)) != -1){
System.out.println(new String(charArr,0,len));
}
// byte[] bytes2 = new byte[1024];
// while((len = isr.read(bytes2)) != -1){
// System.out.println(new String(bytes,0,len));
// }
//释放资源
socket.close();
bis.close();
}
}
再创建一个服务器
package Demo03_文件上传案例的优化;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
/**
* 将服务器上传的文件复制到C:\\File\\upload文件夹中
* 优化:
* 使服务器一直在运转,并且复制的文件名字不会重复
* @author 邱锦宏
*
*/
public class Demo02_ServerSocket {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(888);
while(true){
Socket socket = server.accept();
/*
使用多线程技术,提高程序的效率
有一个客户端上传文件,就开启一-个线程,完成文件的上传
*/
new Thread(new Runnable(){
@Override
public void run(){
//注意这里的异常要使用try...catch 否则会出错
try{
//判断这个文件夹是否存在,不存在则创建该文件夹
InputStream is = socket.getInputStream();
File file = new File("C:\\File\\upload");
if(!file.exists()){
file.mkdirs();
}
String fileName = "qjh" + System.currentTimeMillis() + new Random().nextInt(999999) + ".jpg";
//将文件上传到本地
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file + "\\" + fileName));
byte[] bytes = new byte[1024];
int len = 0;
while((len = is.read(bytes)) != -1){
bos.write(bytes,0,len);
}
//回复服务器上传成功
OutputStream os = socket.getOutputStream();
//使用转换流,不然传到客户端的信息会乱码
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
osw.write("文件上传成功");
//释放资源
osw.close();
socket.close();
bos.close();
}catch(IOException e){
System.out.println(e);
}
}
}).start();
}
//server.close();
}
}
在上传文件前,要先运行服务器,在运行客户端,否则会报错