java socket 传输文件(2)

发送端:

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:\\config.xml", 8821);

}

}


接收端:
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);
}
}

猜你喜欢

转载自andy2019.iteye.com/blog/1508700
今日推荐