Java实现文件上传服务器和客户端
本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下
文件上传服务器端:
/**
*使用TCP协议实现上传功能的服务器端
*思路:
*新建ServerSocket
*等待客户端连接
*连接上后开启子线程,把连接获取的Socket传给子线程
*循环进行
*@authoryajun
*
*/
publicclassUploadServer{
publicstaticvoidmain(String[]args){
UploadServerserver=newUploadServer();
UploadThreadcommand=newUploadThread();
server.start(command);
}
/**
*功能:接受连接,开启子线程,循环
*@paramcommand用于下载的子线程对象,该对象实现了Runnable接口
*/
privatevoidstart(UploadThreadcommand){
//局部变量
ServerSocketserverSocket=null;
SockettransSocket;
//业务逻辑
try{
serverSocket=newServerSocket(55555);
while(true){
System.out.println("等待连接……");
transSocket=serverSocket.accept();
inti=0;
i++;
System.out.println("第"+i+"个连接");
//用不用在下载完后关闭线程呢???
command.setSocket(transSocket);
Executors.newFixedThreadPool(5).execute(command);
}
//异常捕获
}catch(IOExceptione){
e.printStackTrace();
//关闭资源
}finally{
try{
serverSocket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}//Endoftry
}//Endofconnect
@Test
publicvoidtestConnect(){
//测试任务:先运行服务器端,然后多次运行客户端,服务器段可以不断创建子线程,则测试成功
//测试准备:构造一个线程,用于模拟下载线程
UploadThreadcommand=newUploadThread();
start(command);
}
@Test
publicvoidtestDown()throwsIOException{
byte[]buf;
ByteArrayInputStreambis;
Stringstr="canglaoshi.avi\ncontent,content,content";
buf=str.getBytes();
bis=newByteArrayInputStream(buf);
UploadThreadut=newUploadThread();
ut.down(bis);
}
}
//完成各个传输任务的子线程
classUploadThreadimplementsRunnable{
Socketsocket;
publicUploadThread(){}
publicUploadThread(Socketsocket){
this.socket=socket;
}
@Override
publicvoidrun(){
InputStreamin;
try{
in=socket.getInputStream();
down(in);
//异常处理
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
socket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
//测试代码
/*try{
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+",复制完毕");
}catch(InterruptedExceptione){
e.printStackTrace();
}*/
}//Endofrun
publicvoidsetSocket(Socketsocket){
this.socket=socket;
}
//下载方法
/**
*目标:把InputStream中的数据写入到本地
*思路:
*1.获取输入流,最好传入输入流,而不是直接从Socket获取,传入有利用单元测试
*2.从输入流中读到文件名
*3.新建文件和文件输出流
*4.从输入流中读到文件内容到文件输出流
*5.
*@throwsIOException
*/
publicvoiddown(InputStreamin)throwsIOException{
//局部变量
charch;
char[]nameArr=newchar[256];
byte[]buf=newbyte[1024];
Stringname="";
OutputStreamout=null;
//业务逻辑
try{
//第一步:获取文件名,构造文件输出流
inti=0;
while((ch=(char)in.read())!='\n'){
nameArr[i++]=ch;
}
//name=nameArr.toString();//这句话无法将字符数组转换为字符串,需用下面的语句
name=newString(nameArr);
System.out.println("要下载的文件为:"+name);
out=newFileOutputStream("src\\down\\"+name);
//第二步:将输入流中的其他内容写入到文件
intlen;
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
out.flush();
//异常捕获
}catch(IOExceptione){
e.printStackTrace();
//关闭资源
}finally{
//疑问:两个捕获可不可以放到一块呢,怎样处理关闭流时的异常最好呢?
in.close();
out.close();
}
//调试
System.out.println(name);
}
}//EndofUploadThread
文件上传客户端:
/**
*使用TCP协议实现上传功能的客户端
*@authoryajun
*/
publicclassUploadClient{
publicstaticvoidmain(String[]args){
UploadClientclient=newUploadClient();
client.upload("src\\thursday\\AsListTest.java");
}
/**
*作用:上传文件到服务器
*1.建立到服务器的连接
*2.获取输出流
*3.将文件内容写入到输出流
*4.获取服务器的响应
*/
privatevoidupload(Stringname){
Socketsocket=null;
OutputStreamout;
try{
socket=newSocket("127.0.0.1",55555);
out=socket.getOutputStream();
write2OutputStream(name,out);
//异常捕获
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
@Test
publicvoidtestUpload(){
upload("src\\status.xml");
}
/**
*作用:传入文件名和输出流,将文件写入到输出流
*@parampath
*@throwsIOException
*/
privatevoidwrite2OutputStream(Stringpath,OutputStreamout)throwsIOException{
FileInputStreamfis=null;
byte[]buf=newbyte[1024];
StringfileName="";
//业务逻辑
try{
//1.写入文件名
fileName=path.substring(path.lastIndexOf('\\')+1);
System.out.println("您要上传的文件名为:"+fileName);
out.write(fileName.getBytes());
out.write('\n');
//2.写入文件内容
fis=newFileInputStream(path);
intlen;
while((len=fis.read(buf))!=-1){
out.write(buf,0,len);
}
out.flush();
//异常处理
}catch(IOExceptione){
e.printStackTrace();
//关闭资源
}finally{
fis.close();
out.close();
}
}//Endofupload
@Test
publicvoidtestWrite2OutputStream()throwsIOException{
ByteArrayOutputStreamout=null;
try{
out=newByteArrayOutputStream();
write2OutputStream("src\\status.xml",out);
System.out.println(out.toString("utf-8"));
}catch(IOExceptione){
e.printStackTrace();
}finally{
out.close();
}
}
}
本文已被整理到了《Java上传操作技巧汇总》,欢迎大家学习阅读。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。