Java实现文件上传服务器和客户端

本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下

文件上传服务器端:

/**

* 使用TCP协议实现上传功能的服务器端

* 思路:

* 新建ServerSocket

* 等待客户端连接

* 连接上后开启子线程,把连接获取的Socket传给子线程

* 循环进行

* @author yajun

*

*/

public class UploadServer {

public static void main(String[] args) {

UploadServer server=new UploadServer();

UploadThread command=new UploadThread();

server.start(command);

}

/**

* 功能:接受连接,开启子线程,循环

* @param command 用于下载的子线程对象,该对象实现了Runnable接口

*/

private void start(UploadThread command){

//局部变量

ServerSocket serverSocket = null;

Socket transSocket;

//业务逻辑

try {

serverSocket=new ServerSocket(55555);

while(true){

System.out.println("等待连接……");

transSocket=serverSocket.accept();

int i=0;

i++;

System.out.println("第"+i+"个连接");

//用不用在下载完后关闭线程呢???

command.setSocket(transSocket);

Executors.newFixedThreadPool(5).execute(command);

}

//异常捕获

} catch (IOException e) {

e.printStackTrace();

//关闭资源

} finally{

try {

serverSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}//End of try

}//End of connect

@Test

public void testConnect() {

//测试任务:先运行服务器端,然后多次运行客户端,服务器段可以不断创建子线程,则测试成功

//测试准备:构造一个线程,用于模拟下载线程

UploadThread command=new UploadThread();

start(command);

}

@Test

public void testDown() throws IOException {

byte[] buf;

ByteArrayInputStream bis;

String str="canglaoshi.avi\ncontent,content,content";

buf=str.getBytes();

bis=new ByteArrayInputStream(buf);

UploadThread ut=new UploadThread();

ut.down(bis);

}

}

//完成各个传输任务的子线程

class UploadThread implements Runnable{

Socket socket;

public UploadThread(){}

public UploadThread(Socket socket){

this.socket=socket;

}

@Override

public void run() {

InputStream in;

try {

in = socket.getInputStream();

down(in);

//异常处理

} catch (IOException e) {

e.printStackTrace();

} finally{

try {

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

//测试代码

/*try {

Thread.sleep(5000);

System.out.println(Thread.currentThread().getName()+",复制完毕");

} catch (InterruptedException e) {

e.printStackTrace();

}*/

}//End of run

public void setSocket(Socket socket){

this.socket=socket;

}

//下载方法

/**

* 目标:把InputStream中的数据写入到本地

* 思路:

* 1.获取输入流,最好传入输入流,而不是直接从Socket获取,传入有利用单元测试

* 2.从输入流中读到文件名

* 3.新建文件和文件输出流

* 4.从输入流中读到文件内容到文件输出流

* 5.

* @throws IOException

*/

public void down(InputStream in) throws IOException{

//局部变量

char ch;

char[] nameArr=new char[256];

byte[] buf=new byte[1024];

String name="";

OutputStream out = null;

//业务逻辑

try {

//第一步:获取文件名,构造文件输出流

int i=0;

while((ch=(char) in.read())!='\n'){

nameArr[i++]= ch;

}

//name=nameArr.toString();//这句话无法将字符数组转换为字符串,需用下面的语句

name=new String(nameArr);

System.out.println("要下载的文件为:"+name);

out=new FileOutputStream("src\\down\\"+name);

//第二步:将输入流中的其他内容写入到文件

int len;

while((len=in.read(buf))!=-1){

out.write(buf,0,len);

}

out.flush();

//异常捕获

} catch (IOException e) {

e.printStackTrace();

//关闭资源

}finally{

//疑问:两个捕获可不可以放到一块呢,怎样处理关闭流时的异常最好呢?

in.close();

out.close();

}

//调试

System.out.println(name);

}

}//End of UploadThread

文件上传客户端:

/**

* 使用TCP协议实现上传功能的客户端

* @author yajun

*/

public class UploadClient {

public static void main(String[] args) {

UploadClient client=new UploadClient();

client.upload("src\\thursday\\AsListTest.java");

}

/**

* 作用:上传文件到服务器

* 1.建立到服务器的连接

* 2.获取输出流

* 3.将文件内容写入到输出流

* 4.获取服务器的响应

*/

private void upload(String name){

Socket socket=null;

OutputStream out;

try {

socket=new Socket("127.0.0.1", 55555);

out=socket.getOutputStream();

write2OutputStream(name, out);

//异常捕获

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

@Test

public void testUpload() {

upload("src\\status.xml");

}

/**

* 作用:传入文件名和输出流,将文件写入到输出流

* @param path

* @throws IOException

*/

private void write2OutputStream(String path,OutputStream out) throws IOException{

FileInputStream fis = null;

byte[] buf=new byte[1024];

String fileName="";

//业务逻辑

try {

//1.写入文件名

fileName=path.substring(path.lastIndexOf('\\')+1);

System.out.println("您要上传的文件名为:"+fileName);

out.write(fileName.getBytes());

out.write('\n');

//2.写入文件内容

fis=new FileInputStream(path);

int len;

while((len=fis.read(buf))!=-1){

out.write(buf, 0, len);

}

out.flush();

//异常处理

} catch (IOException e) {

e.printStackTrace();

//关闭资源

} finally{

fis.close();

out.close();

}

}//End of upload

@Test

public void testWrite2OutputStream() throws IOException {

ByteArrayOutputStream out = null;

try {

out=new ByteArrayOutputStream();

write2OutputStream("src\\status.xml", out);

System.out.println(out.toString("utf-8"));

} catch (IOException e) {

e.printStackTrace();

} finally{

out.close();

}

}

}

本文已被整理到了《Java上传操作技巧汇总》,欢迎大家学习阅读。

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 Java实现文件上传服务器和客户端 的全部内容, 来源链接: utcz.com/z/344682.html

回到顶部