JAVA—TCP文件上传以及优化
分析:
/*
* 1.客户端使用本地字节输入流,读取要上传的文件
* 2.客户端使用网络字节输出流,把读取到的文件上传到服务器
* 3.服务器使用网络字节输入流,读取客户端传来的文件
* 4.服务器使用本地字节输出流,把上传的文件保存到服务器硬盘上
* 5.服务器使用网络字节输出流,给客户端发送“上传成功”
* 6.客户端使用网络字节输入流,读取服务器回写的数据
* 7.释放资源
* */
客户端:
public static void main(String[] args) throws IOException {
//1.客户端使用本地字节输入流,
FileInputStream fis = new FileInputStream("D:\\photo\\b.jpg");
//2.客户端使用网络字节输出流,把读取到的文件上传到服务器
Socket socket = new Socket("127.0.0.1",23456);
OutputStream os = socket.getOutputStream();
//使用本地的流读取要上传的文件
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1){
//把读取到的文件上传到服务器
os.write(bytes,0,len);
}
//上传完文件,给服务器写个结束标记
socket.shutdownOutput();
//6.客户端使用网络字节输入流,读取服务器回写的数据
InputStream is = socket.getInputStream();
while ((len = is.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
fis.close();
socket.close();
}
服务器
public static void main(String[] args) throws IOException {
//1.创建服务器对象,绑定端口号
ServerSocket serverSocket = new ServerSocket(23456);
/*
* 让服务器一直处于监听状态(死循环accept),有一个客户端上传文件,就保存一个文件
* */
//2.使用ServerSocket对象的accept方法,获取请求到的客户端Socket对象
while (true){
Socket socket = serverSocket.accept();
/*
* 提高效率,开启线程
* */
new Thread(new Runnable() {
@Override
public void run() {
try {
//3.使用Socket对象的getInputStream方法获取网络字节输入流
InputStream is = socket.getInputStream();
//4.判断服务器存储文件的文件夹是否存在,不存在就创建
File file = new File("D:\\upload");
if (!file.exists()){
file.mkdirs();
}
/*
* 自定义一个文件名的命名规则,防止同文件名被覆盖
* 域名+毫秒值
* */
String fileName = "zsh" + System.currentTimeMillis() + ".jpg";
//5.创建本地字节输出流,构造绑定存储的地址
FileOutputStream fis = new FileOutputStream(file + "\\" + fileName);
//6.使用网络字节输入流,读取客户端上传的文件
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1){
//7.使用本地字节输出流的write方法,把读取到的文件写入到服务器上
fis.write(bytes,0,len);
}
//8.使用Socket对象的getOutputStream方法获取网络字节输出流
OutputStream os = socket.getOutputStream();
//9.使用write方法,给客户端写回“上传成功”
os.write("上传成功".getBytes());
//10.释放资源
fis.close();
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
//服务器不用关闭
//serverSocket.close();
}