----------------------------android培训、java培训、期待与您交流!----------------------------------
文件上传案例分析
一、需求分析
1.多线程服务器, ServerSocket监听指定端口,在单独线程中接收文件
2.客户端,读键盘接受文件名,上传文件
3.文件上传,读文件,上传服务器,写文件
二、实现步骤
1.实现服务器
1)ServerSocket 绑定端口
2)在循环中,调用accept方法等待客户端的连接请求
3)new Thread(new UploadServicer(socket)).start(); 开启多线程运行服务程序
4)UploadServicer中,定义构造函数接受socket,run方法中写服务代码
5)获得输入输出流 getInputStream getOutputStream
2.实现客户端
1)创建客户端Socket
2)获得输入输出流 getInputStream getOutputStream
3)和服务器端进行信息交互
3.欢迎语
1)服务器端out.write
2)客户端 in.read
4.发送文件名
1)客户端
1.1 读键盘,让用户输入一个文件的路径,BufferedReader包装System.in
1.2 判断,是不是标准文件,判断文件是否存在,如果不是,给出相应的错误信息
1.3 如果是个存在的文件,getName获得文件名,用out.write将文件名写给服务器
2)服务器端
1.1 in.read 阻塞,接受文件名
1.2 在服务器端指定一个文件夹存放上传的文件, e:/upload
1.3 在指定的文件夹下创建同名文件
1.4 如果创建失败,告诉客户端无法上传 如果文件已存在,告诉客户端文件存在, 程序不能再继续
1.5 如果创建成功,告诉客户端可以开始上传 out.write("可以上传文件".getBytes())
5.发送文件
1)客户端
1.1 获得服务器的反馈信息,如果不能上传,return
1.2 如果可以上传,
BufferedInputStream包装FileInputStream,读文件
BufferedOutputStream包装out(连着服务器),写出数据
int ch;
while((ch=bis.read())!=-1)
bos.write(ch);
bos.flush();
2)服务器端
1.1 BufferedInputStream包装in(连着客户端),读取数据
BufferedOutputStream包装FileOutputStream,将数据写入文件
int ch;
while((ch=bis.read())!=-1)
bos.write(ch);
bos.flush();
服务器端:
package com.du;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server implements Runnable {
private Socket s = null;
public Server(Socket s) {
// TODO Auto-generated constructor stub
this.s = s;
}
@Override
public void run() {
File mulu = new File("d:\\images");
int i = 1;
File file = new File(mulu, (i++) + ".jpg");
try {
InputStream in = s.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
FileOutputStream out = new FileOutputStream(file);
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.close();
in.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket ss = new ServerSocket(22222);
while (true) {
Socket s = ss.accept();
new Thread(new Server(s)).start();
}
}
}
客户机端:
package com.du;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", 22222);
File file = new File("e:\\du.jpg");
if(!file.exists()){
throw new RuntimeException("文件不存在");
}
InputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
OutputStream out = s.getOutputStream();
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
s.shutdownOutput();
out.close();
in.close();
}
}
分离文件:
package com.du;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
import org.junit.Test;
public class SplitFile {
@Test
public void split() throws Exception {
File file = new File("d:\\images\\2.jpg");
FileInputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024 * 30];
int len = 0;
int i = 1;
while ((len = in.read(buffer)) != -1) {
FileOutputStream out = new FileOutputStream("d:\\" + (i++) + ".du");
out.write(buffer, 0, len);
out.close();
}
in.close();
}
@Test
public void merge() throws Exception {
File root = new File("d:\\");
File[] dufile = root.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
return pathname.getName().endsWith(".du");
}
});
Vector<FileInputStream> v = new Vector<FileInputStream>();
for (File f : dufile) {
v.add(new FileInputStream(f));
}
Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream out = new FileOutputStream("d:\\peng.jpg");
byte[] buffer = new byte[1024 * 30];
int len=0;
while((len=sis.read(buffer))!=-1){
out.write(buffer, 0, len);
}
out.close();
sis.close();
}
}