java 展示服务器文件列表,该程序在Java中将所有文件从一台服务器传输到另一台服务器时显示进度条...

i have written a java code to transfer files from one server to another using the concept of socket programming. now in the same code i also want to check for the network connection availability before each file is transferred. i also want that the files transferred should be transferred according to their numerical sequence. And while the files are being transferred the transfer progress of each file i.e the progress percentage bar should also be visible on the screen.

i will really appreciate if someone can help me with the code. i am posting the code i have written for file transfer.

ClientMain.java

import java.io.*;

import java.net.Socket;

import java.net.SocketException;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

public class ClientMain {

private DirectoryTxr transmitter = null;

Socket clientSocket = null;

private boolean connectedStatus = false;

private String ipAddress;

String srcPath = null;

String dstPath = "";

public ClientMain() {

}

public void setIpAddress(String ip) {

this.ipAddress = ip;

}

public void setSrcPath(String path) {

this.srcPath = path;

}

public void setDstPath(String path) {

this.dstPath = path;

}

private void createConnection() {

Runnable connectRunnable = new Runnable() {

public void run() {

while (!connectedStatus) {

try {

clientSocket = new Socket(ipAddress, 3339);

connectedStatus = true;

transmitter = new DirectoryTxr(clientSocket, srcPath, dstPath);

} catch (IOException io) {

io.printStackTrace();

}

}

}

};

Thread connectionThread = new Thread(connectRunnable);

connectionThread.start();

}

public static void main(String[] args) {

ClientMain main = new ClientMain();

main.setIpAddress("10.6.3.92");

main.setSrcPath("E:/temp/movies/");

main.setDstPath("D:/tcp/movies");

main.createConnection();

}

}

(DirectoryTxr.java)

import java.io.*;

import java.net.Socket;

import java.net.SocketException;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

public class DirectoryTxr {

Socket clientSocket = null;

String srcDir = null;

String dstDir = null;

byte[] readBuffer = new byte[1024];

private InputStream inStream = null;

private OutputStream outStream = null;

int state = 0;

final int permissionReqState = 1;

final int initialState = 0;

final int dirHeaderSendState = 2;

final int fileHeaderSendState = 3;

final int fileSendState = 4;

final int fileFinishedState = 5;

private boolean isLive = false;

private int numFiles = 0;

private int filePointer = 0;

String request = "May I send?";

String respServer = "Yes,You can";

String dirResponse = "Directory created...Please send files";

String fileHeaderRecvd = "File header received ...Send File";

String fileReceived = "File Received";

String dirFailedResponse = "Failed";

File[] opFileList = null;

public DirectoryTxr(Socket clientSocket, String srcDir, String dstDir) {

try {

this.clientSocket = clientSocket;

inStream = clientSocket.getInputStream();

outStream = clientSocket.getOutputStream();

isLive = true;

this.srcDir = srcDir;

this.dstDir = dstDir;

state = initialState;

readResponse(); //starting read thread

sendMessage(request);

state = permissionReqState;

} catch (IOException io) {

io.printStackTrace();

}

}

private void sendMessage(String message) {

try {

sendBytes(request.getBytes("UTF-8"));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

/**

* Thread to read response from server

*/

private void readResponse() {

Runnable readRunnable = new Runnable() {

public void run() {

while (isLive) {

try {

int num = inStream.read(readBuffer);

if (num > 0) {

byte[] tempArray = new byte[num];

System.arraycopy(readBuffer, 0, tempArray, 0, num);

processBytes(tempArray);

}

} catch (SocketException se) {

System.exit(0);

} catch (IOException io) {

io.printStackTrace();

isLive = false;

}

}

}

};

Thread readThread = new Thread(readRunnable);

readThread.start();

}

private void sendDirectoryHeader() {

File file = new File(srcDir);

if (file.isDirectory()) {

try {

String[] childFiles = file.list();

numFiles = childFiles.length;

String dirHeader = "$" + dstDir + "#" + numFiles + "&";

sendBytes(dirHeader.getBytes("UTF-8"));

} catch (UnsupportedEncodingException en) {

en.printStackTrace();

}

} else {

System.out.println(srcDir + " is not a valid directory");

}

}

private void sendFile(String dirName) {

File file = new File(dirName);

if (!file.isDirectory()) {

try {

int len = (int) file.length();

int buffSize = len / 8;

//to avoid the heap limitation

RandomAccessFile raf = new RandomAccessFile(file, "rw");

FileChannel channel = raf.getChannel();

int numRead = 0;

while (numRead >= 0) {

ByteBuffer buf = ByteBuffer.allocate(1024 * 100000);

numRead = channel.read(buf);

if (numRead > 0) {

byte[] array = new byte[numRead];

System.arraycopy(buf.array(), 0, array, 0, numRead);

sendBytes(array);

}

}

System.out.println("Finished");

} catch (IOException io) {

io.printStackTrace();

}

}

}

private void sendHeader(String fileName) {

try {

File file = new File(fileName);

if (file.isDirectory())

return;//avoiding child directories to avoid confusion

//if want we can sent them recursively

//with proper state transitions

String header = "&" + fileName + "#" + file.length() + "*";

sendHeader(header);

sendBytes(header.getBytes("UTF-8"));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

private void sendBytes(byte[] dataBytes) {

synchronized (clientSocket) {

if (outStream != null) {

try {

outStream.write(dataBytes);

outStream.flush();

} catch (IOException io) {

io.printStackTrace();

}

}

}

}

private void processBytes(byte[] data) {

try {

String parsedMessage = new String(data, "UTF-8");

System.out.println(parsedMessage);

setResponse(parsedMessage);

} catch (UnsupportedEncodingException u) {

u.printStackTrace();

}

}

private void setResponse(String message) {

if (message.trim().equalsIgnoreCase(respServer) && state == permissionReqState) {

state = dirHeaderSendState;

sendDirectoryHeader();

} else if (message.trim().equalsIgnoreCase(dirResponse) && state == dirHeaderSendState) {

state = fileHeaderSendState;

if (LocateDirectory()) {

createAndSendHeader();

} else {

System.out.println("Vacant or invalid directory");

}

} else if (message.trim().equalsIgnoreCase(fileHeaderRecvd) && state == fileHeaderSendState) {

state = fileSendState;

sendFile(opFileList[filePointer].toString());

state = fileFinishedState;

filePointer++;

} else if (message.trim().equalsIgnoreCase(fileReceived) && state == fileFinishedState) {

if (filePointer < numFiles) {

createAndSendHeader();

}

System.out.println("Successfully sent");

} else if (message.trim().equalsIgnoreCase(dirFailedResponse)) {

System.out.println("Going to exit....Error ");

// System.exit(0);

} else if (message.trim().equalsIgnoreCase("Thanks")) {

System.out.println("All files were copied");

}

}

private void closeSocket() {

try {

clientSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

private boolean LocateDirectory() {

boolean status = false;

File file = new File(srcDir);

if (file.isDirectory()) {

opFileList = file.listFiles();

numFiles = opFileList.length;

if (numFiles <= 0) {

System.out.println("No files found");

} else {

status = true;

}

}

return status;

}

private void createAndSendHeader() {

File opFile = opFileList[filePointer];

String header = "&" + opFile.getName() + "#" + opFile.length() + "*";

try {

state = fileHeaderSendState;

sendBytes(header.getBytes("UTF-8"));

} catch (UnsupportedEncodingException e) {

}

}

private void sendListFiles() {

createAndSendHeader();

}

}

(ServerMain.java)

public class ServerMain {

public ServerMain() {

}

public static void main(String[] args) {

DirectoryRcr dirRcr = new DirectoryRcr();

}

}

(DirectoryRcr.java)

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.SocketException;

public class DirectoryRcr {

String request = "May I send?";

String respServer = "Yes,You can";

String dirResponse = "Directory created...Please send files";

String dirFailedResponse = "Failed";

String fileHeaderRecvd = "File header received ...Send File";

String fileReceived = "File Received";

Socket socket = null;

OutputStream ioStream = null;

InputStream inStream = null;

boolean isLive = false;

int state = 0;

final int initialState = 0;

final int dirHeaderWait = 1;

final int dirWaitState = 2;

final int fileHeaderWaitState = 3;

final int fileContentWaitState = 4;

final int fileReceiveState = 5;

final int fileReceivedState = 6;

final int finalState = 7;

byte[] readBuffer = new byte[1024 * 100000];

long fileSize = 0;

String dir = "";

FileOutputStream foStream = null;

int fileCount = 0;

File dstFile = null;

public DirectoryRcr() {

acceptConnection();

}

private void acceptConnection() {

try {

ServerSocket server = new ServerSocket(3339);

socket = server.accept();

isLive = true;

ioStream = socket.getOutputStream();

inStream = socket.getInputStream();

state = initialState;

startReadThread();

} catch (IOException io) {

io.printStackTrace();

}

}

private void startReadThread() {

Thread readRunnable = new Thread() {

public void run() {

while (isLive) {

try {

int num = inStream.read(readBuffer);

if (num > 0) {

byte[] tempArray = new byte[num];

System.arraycopy(readBuffer, 0, tempArray, 0, num);

processBytes(tempArray);

}

sleep(100);

} catch (SocketException s) {

} catch (IOException e) {

e.printStackTrace();

} catch (InterruptedException i) {

i.printStackTrace();

}

}

}

};

Thread readThread = new Thread(readRunnable);

readThread.start();

}

private void processBytes(byte[] buff) throws InterruptedException {

if (state == fileReceiveState || state == fileContentWaitState) {

//write to file

if (state == fileContentWaitState)

state = fileReceiveState;

fileSize = fileSize - buff.length;

writeToFile(buff);

if (fileSize == 0) {

state = fileReceivedState;

try {

foStream.close();

} catch (IOException io) {

io.printStackTrace();

}

System.out.println("Received " + dstFile.getName());

sendResponse(fileReceived);

fileCount--;

if (fileCount != 0) {

state = fileHeaderWaitState;

} else {

System.out.println("Finished");

state = finalState;

sendResponse("Thanks");

Thread.sleep(2000);

System.exit(0);

}

System.out.println("Received");

}

} else {

parseToUTF(buff);

}

}

private void parseToUTF(byte[] data) {

try {

String parsedMessage = new String(data, "UTF-8");

System.out.println(parsedMessage);

setResponse(parsedMessage);

} catch (UnsupportedEncodingException u) {

u.printStackTrace();

}

}

private void setResponse(String message) {

if (message.trim().equalsIgnoreCase(request) && state == initialState) {

sendResponse(respServer);

state = dirHeaderWait;

} else if (state == dirHeaderWait) {

if (createDirectory(message)) {

sendResponse(dirResponse);

state = fileHeaderWaitState;

} else {

sendResponse(dirFailedResponse);

System.out.println("Error occurred...Going to exit");

System.exit(0);

}

} else if (state == fileHeaderWaitState) {

createFile(message);

state = fileContentWaitState;

sendResponse(fileHeaderRecvd);

} else if (message.trim().equalsIgnoreCase(dirFailedResponse)) {

System.out.println("Error occurred ....");

System.exit(0);

}

}

private void sendResponse(String resp) {

try {

sendBytes(resp.getBytes("UTF-8"));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

private boolean createDirectory(String dirName) {

boolean status = false;

dir = dirName.substring(dirName.indexOf("$") + 1, dirName.indexOf("#"));

fileCount = Integer.parseInt(dirName.substring(dirName.indexOf("#") + 1, dirName.indexOf("&")));

if (new File(dir).mkdir()) {

status = true;

System.out.println("Successfully created directory " + dirName);

} else if (new File(dir).mkdirs()) {

status = true;

System.out.println("Directories were created " + dirName);

} else if (new File(dir).exists()) {

status = true;

System.out.println("Directory exists" + dirName);

} else {

System.out.println("Could not create directory " + dirName);

status = false;

}

return status;

}

private void createFile(String fileName) {

String file = fileName.substring(fileName.indexOf("&") + 1, fileName.indexOf("#"));

String lengthFile = fileName.substring(fileName.indexOf("#") + 1, fileName.indexOf("*"));

fileSize = Integer.parseInt(lengthFile);

dstFile = new File(dir + "/" + file);

try {

foStream = new FileOutputStream(dstFile);

System.out.println("Starting to receive " + dstFile.getName());

} catch (FileNotFoundException fn) {

fn.printStackTrace();

}

}

private void writeToFile(byte[] buff) {

try {

foStream.write(buff);

} catch (IOException io) {

io.printStackTrace();

}

}

private void sendBytes(byte[] dataBytes) {

synchronized (socket) {

if (ioStream != null) {

try {

ioStream.write(dataBytes);

} catch (IOException io) {

io.printStackTrace();

}

}

}

}

}

ClientMain.java and DirectoryTxr.java are the two classes under client application. ServerMain.java and DirectoryRcr.java are the two classes under Server application.

run the ClientMain.java and ServerMain.java

解决方案

You can sort an array using Arrays.sort(...)

ie

String[] childFiles = file.list();

Arrays.sort(childFiles);

As I understand it, this will sort the files in natural order, based on the file name.

You can modify this by passing a custom Comparator...

Arrays.sort(childFiles, new Comparator() {...}); // Fill out with your requirements...

Progress monitoring will come down to your requirements. Do you want to see only the overall progress of the number of files, the individual files, a combination of both?

What I've done in the past is pre-iterated the file list, calculated the total number of bytes to be copied and used a ProgressMonitor to display the overall bytes been copied...

Otherwise you will need to supply your own dialog. In either case, you will need use SwingUtilities.invokeLater to update them correctly.

Check out Concurrency in Swing for more details.

Network connectivity is subjective. You could simply send a special "message" to there server and wait for a response, but this only suggests that the message was sent and a recipt was received. It could just as easily fail when you start transfering the file again...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值