您的位置:首页 > 编程语言 > Java开发

用Java实现简单的文件上传服务器和客户端

2014-01-02 20:32 916 查看

文件上传服务器端:

/**
* 使用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();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: