`
郑云飞
  • 浏览: 799722 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于TCP协议的文件传输

阅读更多
/**
 * @author 郑云飞
 * 日期:2010年08月18日1:26
 * 内容:基于TCP协议的文件传输
 * 服务器端程序
 */
package socketFile;
import java.io.*;
import java.net.*;
public class Server extends Thread
{
	 File fi;
	 DataOutputStream ps ;
	 String filePath;
		BufferedReader in;
		public void run()
		{
			Socket s=null;
			try
			{
				ServerSocket ss = new ServerSocket(8888);
				System.out.println("服务器启动");
			   	while (true)
				{
					boolean isExist=true;//循环的标志
					s = ss.accept();//一直出于阻塞状态,直到有客户连接
					while(isExist)
					{
						isExist=false;
						System.out.println("与客户端成功建立连接");
					    in=new BufferedReader(new InputStreamReader(s.getInputStream()));//从客户端获取信息
					     filePath=in.readLine();//将从客户端读取到的信息赋给变量filePath
					     fi= new File(filePath);//用刚才的字符串变量创建一个文件
					     boolean flag=fi.exists();//判断文件是否存在
						 ps=new DataOutputStream(s.getOutputStream());
						 ps.writeBoolean(flag);//将文件是否存在的标志写入流ps中,发送给客户端
						 ps.flush();//刷新缓冲流
						 if(flag==false)
						 {
							 isExist=true;
						 }
						 else
						 {
							 System.out.println("文件长度:" + (long) fi.length());
		    					DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
		    					
		    					// 将文件名及长度传给客户端。
		    					ps.writeUTF(fi.getName());
		    					ps.flush();
		    					ps.writeLong((long) fi.length());
		    					ps.flush();
		    					int bufferSize = 8192;
		    					byte[] buf = new byte[bufferSize];
		    					int read = 0;
		    					while ((read = fis.read(buf))!=-1)
		    					{
		    						ps.write(buf, 0, read);
		    					}
		    					ps.flush();
		    					// 注意关闭socket链接哦,不然客户端会等待server的数据过来,
		    					// 直到socket超时,导致数据不完整。
		    					fis.close();
		    					s.close();
		    					System.out.println("文件传输完成");
						 }
						
					}
						 
					}

			} 
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	public static void main(String[] args)
	{
		new Server().start();
	}
}

 

/**
 * @author 郑云飞
 * 日期:2010年08月18日1:26
 * 内容:基于TCP协议的文件传输
 * 客户端程序
 */
package socketFile;
import java.io.*;
import java.net.Socket;
public class Client
{
	public static void main(String arg[])
	{
		Socket cs;

        DataInputStream dis;
		try
		{
			    cs = new Socket("localhost", 8888);
			    String savePath = "F:/";
			    System.out.print("连接服务器成功!" + "");
			    boolean fileFlag=true;//判断是否循环输入的标志,如果文件路径存在,返回true,否则返回false
			    while(fileFlag)
				   { 
        			    fileFlag=false;
        				System.out.println("请选择要下载的东西:");
        				BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//从键盘输入文件的路径
        				String filePath=br.readLine();//将从键盘输入的文件路径赋给变量filePath
        				//将从键盘输入的文件路径写入到pw中,返回给服务器端
        				PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(cs.getOutputStream())),true);
        				pw.println(filePath);//将文件的路径写入流pw中,返回给服务器端
        			    dis=new DataInputStream(cs.getInputStream());
        			    boolean isExist=dis.readBoolean();//读取服务器端返回来的文件是否存在的标志
        			   if(isExist==false)
        			   {
        				   fileFlag=true;
        			   }
        			   else
        			   {
               					 dis = new DataInputStream(new BufferedInputStream(cs.getInputStream()));
               					// 本地保存路径,文件名会自动从服务器端继承而来。
               					long passedlen = 0;
               					long len = 0;
               					savePath += dis.readUTF();//读取文件的保存路径
               					DataOutputStream fileout = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
               					len = dis.readLong();//读取文件的长度
               					System.out.println("文件的长度为:" + len + "");
               					System.out.println("开始接收文件!" + "");
               					int bufferSize = 8192;
               					byte[] buf = new byte[bufferSize];
               					int read = 0;
               					while ((read = dis.read(buf))!=-1)
               					{
               						passedlen += read;
               						// 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,
               						// 可能会重复打印出一些相同的百分比
               						System.out.println("文件接收了" + (passedlen * 100 / len) + "%");
               						fileout.write(buf, 0, read);
               					}
               					//注意必须关闭文件输出流,否则接收到的数据为空
               					if(fileout!=null)
               					{
               						fileout.close();
               					}
               					System.out.println("接收完成,文件存为" + savePath + "");
        			   }
				   }
		} 
		catch (Exception ex)
		{
			System.out.print("连接服务器失败!" + "");
		}
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics