file - 通过 TCP 连接传输 mp3 文件。使用 JProgressBar 显示下载进度

标签 file tcp transfer jprogressbar

我正在开发一个通过 TCP 连接发送 mp3 文件的程序。我正在尝试使用 JProgressBar 来显示下载进度。但是在完全下载之前我不知道文件大小。无论如何我可以在从服务器端下载文件之前获取文件大小?

提前致谢。这是我的代码

服务器:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
dataOut = new BufferedOutputStream(clientSocket.getOutputStream());
file = new File(LIBRARY, data);
//get length of file
int fileLength = (int)file.length();

fileData = new byte[fileLength];
fileIn = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fileIn);
bis.read(fileData, 0 , fileData.length);
OutputStream os = clientSocket.getOutputStream();
os.write(fileData, 0 , fileData.length);
os.flush();
clientSocket.close();

客户:

int filesize=999999999; //A TEMPORARY FILE SIZE

long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
// localhost for testing
Socket sock = new Socket(SERVER_NAME,DEST_PORT);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
// receive file
byte [] mybytearray  = new byte [filesize];
out.println(request);
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream(request);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
System.out.println(bytesRead);

do {
      bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
      if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);

bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(current);
bos.close();
sock.close();

最佳答案

已解决: 实际上解决方案并不难。我只是在发送文件之前发送了文件大小。因此,客户端接收到的文件大小将其最大值设置为文件大小 JProgressBar.setMaximum(fileLength);然后使用 setValue() 增加进度条的值; 这是我更新的代码:

服务器:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

dataOut = new BufferedOutputStream(clientSocket.getOutputStream());
file = new File(LIBRARY, data);
//get length of file
int fileLength = (int)file.length();

out.println(fileLength);// this sends the file length

fileData = new byte[fileLength];
fileIn = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fileIn);
bis.read(fileData, 0 , fileData.length);
OutputStream os = clientSocket.getOutputStream();
os.write(fileData, 0 , fileData.length);
os.flush();
clientSocket.close();

客户:

progressBar.setValue(0);
int bytesRead;
int current = 0;
// localhost for testing
Socket sock = new Socket(SERVER_NAME,DEST_PORT);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
// receive file
BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));   //CREATE BUFFERED READER TO READ THE FILE SIZE
out.println(request);
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream(request);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int fileLen = Integer.parseInt(in.readLine());
progressBar.setMaximum(fileLen); // READ THE FILE SIZE
byte [] byteArray  = new byte [fileLen+100]; //SET THE BYTEARRAY 100 BYTES EXTRA
bytesRead = is.read(byteArray,0,byteArray.length);
current = bytesRead;
do {
      bytesRead = is.read(byteArray, current, (byteArray.length-current));
      if(bytesRead >= 0) current += bytesRead;
      progressBar.setValue(current);
} while(bytesRead > -1);

bos.write(byteArray, 0 , current);
bos.flush();
//System.out.println(current);
bos.close();
fos.close();
in.close();
is.close();
sock.close();

关于file - 通过 TCP 连接传输 mp3 文件。使用 JProgressBar 显示下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20279059/

相关文章:

c - 当通过 Socket 发送数据时,send/write 何时返回 -1?

sockets - Racket:TCP 套接字上的设置选项

PHP文件上传无法在同一表单上发送POST数据

c# - 如何正确处置asyc NetworkStream

php - HTML表格数据传输到MS Excel?

jquery - 为什么这个jquery简单的转移效果不起作用?

javascript - 将字符串从一个 Node.js 实例传输到另一个 Node.js 实例

python - Django - 从亚马逊 S3 中删除文件

regex - MATLAB:在目录中查找具有特定名称的文件?

javascript - 使用 fileSaver.js 和 Blob.js 用 javascript 保存文本文件