tcp udp实现文件传输(java)

tcp
 
 
 
 

package org.tcp;

import java.io.BufferedInputStream;   import java.io.DataInputStream;   import java.io.DataOutputStream;   import java.io.File;   import java.io.FileInputStream;   import java.io.IOException;   import java.net.ServerSocket;   import java.net.Socket;     public class FileSender {         private ServerSocket ss = null;         public FileSender() {         }         public void startSend(String filePath, int port) {           // socket输出流           DataOutputStream os = null;           // 文件输入流           DataInputStream is = null;           // 建立socket连接           Socket socket = null;           try {               // 选择进行传输的文件               File file = new File(filePath);                 // 建立socket监听               ss = new ServerSocket(port);                 socket = ss.accept();                 os = new DataOutputStream(socket.getOutputStream());                 // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,               // 具体可以参见Think In Java 4th里有现成的代码。               os.writeUTF(file.getName());               os.flush();               os.writeLong((long) file.length());               os.flush();                 is = new DataInputStream(new BufferedInputStream(                       new FileInputStream(filePath)));               // 缓冲区大小               int bufferSize = 8192;               // 缓冲区               byte[] buf = new byte[bufferSize];               // 传输文件               while (true) {                   int read = 0;                   if (is != null) {                       read = is.read(buf);                   }                     if (read == -1) {                       break;                   }                   os.write(buf, 0, read);               }               os.flush();             } catch (IOException e) {               e.printStackTrace();           } finally {               // 关闭所有连接               try {                   if (os != null)                       os.close();               } catch (IOException e) {               }               try {                   if (is != null)                       is.close();               } catch (IOException e) {               }               try {                   if (socket != null)                       socket.close();               } catch (IOException e) {               }               try {                   if (ss != null)                       ss.close();               } catch (IOException e) {               }           }         }         public static void main(String[] args) {           new FileSender().startSend("E:\\Sky.zip", 8821);       }   } 

 

 
package org.tcp;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class FileIncepter {

	public FileIncepter() {

	}

	public void getFile(String savePath, String ip, int port) {
		// 建立socket连接
		Socket socket = null;
		try {
			socket = new Socket(ip, port);
		} catch (UnknownHostException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		// 建立socket输入流
		DataInputStream inputStream = null;
		try {
			inputStream = new DataInputStream(new BufferedInputStream(socket
					.getInputStream()));
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		try {
			// 缓冲区大小
			int bufferSize = 8192;
			// 缓冲区
			byte[] buf = new byte[bufferSize];
			int passedlen = 0;
			long len = 0;
			// 获取文件名称
			savePath += inputStream.readUTF();
			DataOutputStream fileOut = new DataOutputStream(
					new BufferedOutputStream(new BufferedOutputStream(
							new FileOutputStream(savePath))));
			// 获取文件长度
			len = inputStream.readLong();

			System.out.println("文件的长度为:" + len + "  KB");
			System.out.println("开始接收文件!");

			// 获取文件
			while (true) {
				int read = 0;
				if (inputStream != null) {
					read = inputStream.read(buf);
				}
				passedlen += read;
				if (read == -1) {
					break;
				}
				System.out.println("文件接收了" + (passedlen * 100 / len) + "%");
				fileOut.write(buf, 0, read);
			}
			System.out.println("接收完成,文件存为" + savePath);
			fileOut.close();
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
	}

	public static void main(String[] args) {
		new FileIncepter().getFile("F:\\", "localhost", 8821);
	}
}

udp的:
 
package org.udp;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.util.Date;
import java.util.concurrent.TimeUnit;


public class Sender {
 public static DatagramSocket dataSocket;
 public static final int PORT=7;
 public static byte[] sendDataByte;
 public static DatagramPacket dataPacket;
 public static void main(String[] args) throws IOException, InterruptedException{
  String filePath="D:\\Sky.zip";
  DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
        dataSocket = new DatagramSocket(PORT+1);
        sendDataByte = new byte[1024];
        int read=0;
        long a=new Date().getTime();
        while(true){
            if (fis != null) {  
                    read = fis.read(sendDataByte);  
                }  

                if (read == -1) {
                  System.out.println(new Date().getTime()-a);
                    break;  
                }
        dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,(Inet4Address) Inet4Address.getByName("localhost"), PORT);  
        dataSocket.send(dataPacket); 
        TimeUnit.MICROSECONDS.sleep(1);//限制传输速度
 }
 }
}

 
 
package org.udp;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Incepter {
 public static DatagramSocket dataSocket;
 public static final int PORT=7;
 public static byte[] receiveByte;
 public static DatagramPacket dataPacket;
 public static void main(String[] args) throws IOException{
  dataSocket = new DatagramSocket(PORT);
  DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream("E:\\Sky.zip"))));
              int i = 0;
              while (i == 0)// 无数据,则循环

              {
               receiveByte = new byte[1024];
              dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
                  dataSocket.receive(dataPacket);
                  i = dataPacket.getLength();
                  // 接收数据

                  if (i > 0) {
                      // 指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点

                      fileOut.write(receiveByte,0,i);
                      fileOut.flush();                    
                      i = 0;// 循环接收
                  }

              }
 }
}


 





  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值