JAVA文件传输为什么只能传输一次?

dongrideshui 2013-05-07 03:25:24
Server.java
package finished;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.text.DecimalFormat;

import javax.swing.*;

public class Server extends JFrame {

private JLabel filePath, fileSendRate, fileStatus, space;
private JFileChooser jfc;

private JPanel filePanel;
private JButton sendButton;
private JProgressBar fileProgressBar;

ServerSocket socket;
Socket connectionsocket;
boolean isConnected;
int result;
String filePaths;
String fileName;

public Server(String title) throws Exception {
super(title);
setLayout(new BorderLayout());

sendButton = new JButton("发送");
sendButton.addActionListener(new Send());

filePath = new JLabel("path");//路径
fileStatus = new JLabel("sta");//发送状态
fileSendRate = new JLabel("filesendrate");//发送速度
space = new JLabel();

fileProgressBar = new JProgressBar(0, 100);
fileProgressBar.setStringPainted(true);

filePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

filePanel.add(sendButton);
getContentPane().add(filePanel, BorderLayout.NORTH);
getContentPane().add(fileProgressBar, BorderLayout.SOUTH);

getContentPane().add(filePath);
getContentPane().add(fileStatus);
getContentPane().add(fileSendRate);
getContentPane().add(space);

fileStatus.setBounds(100, 90, 200, 20);
filePath.setBounds(100, 50, 200, 20);
fileSendRate.setBounds(100, 150, 200, 20);
space.setBounds(100, 180, 200, 20);

setBounds(100, 100, 300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

ServerSocket localsocket = new ServerSocket(8989);
JOptionPane.showMessageDialog(null, "服务器已经开启", "提示", 2);
System.out.println("服务器已经开启...");

while (true) {
connectionsocket = localsocket.accept();
isConnected = true;
JOptionPane.showMessageDialog(null, "客户端已链接", "提示", 2);
System.out.println("客户端已链接");
}
}

//
private String fileLength(long length) {
double klength = length * 1.0 / 1024;
DecimalFormat df = new DecimalFormat("0.00");
if (klength < 1024) {
return (df.format(klength) + "K");
} else {
return (df.format(klength / 1024) + "M");
}
}

class Send implements ActionListener {

public void actionPerformed(ActionEvent e) {

if (isConnected == true) {

JFileChooser fc = new JFileChooser();
result = fc.showOpenDialog(sendButton);
final File file = fc.getSelectedFile();

Runnable runnable = new Runnable() {
public void run() {
int passed = 0;
fileProgressBar.setValue(0);
if (file != null
&& result == JFileChooser.APPROVE_OPTION) {
filePaths = file.getAbsolutePath();
System.out.println("文件路径: " + filePaths);
fileName = file.getName();
filePath.setText(fileName);
long filelength = file.length();
System.out.println("文件长度:" + filelength);
try {
File file1 = new File(filePaths);
FileInputStream fos = new FileInputStream(file1);

OutputStream netOut = connectionsocket
.getOutputStream();
DataOutputStream doc = new DataOutputStream(
new BufferedOutputStream(netOut));

doc.writeLong(filelength);
doc.flush();

byte[] buf = new byte[4096];
int num = fos.read(buf);

while (num != (-1)) {
passed += num;
doc.write(buf, 0, num);
doc.flush();
num = fos.read(buf);

System.out.println(passed);
final int x = (int) (100 * (passed / (double) filelength));

if (x == 0) {
fileStatus.setText("等待对方接受");
} else if (x == 100) {
fileStatus.setText("对方接受完毕");
fos.close();
doc.close();
} else {
fileStatus.setText("对方正在接受");
}
fileSendRate.setText(passed + "字节/"
+ filelength + "字节");

SwingUtilities.invokeLater(new Runnable() {
public void run() {
fileProgressBar.setValue(x);
fileProgressBar.setString(String
.valueOf(x)
+ "%");
System.out.println("已经接受:" + x
+ "%");
}
});
}

/*fos.close();
doc.close();*/

} catch (Exception ex) {
System.out.println(ex);
}

}
if (result == JFileChooser.CANCEL_OPTION) {

}
}
};

Thread thread = new Thread(runnable);
thread.start();
}
}
}

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new Server("文件传输服务器端");
}
}

Client.java
package finished;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.text.DecimalFormat;
import java.util.Date;

import javax.swing.*;

public class Client extends JFrame {

private JLabel filePath, fileSendRate, fileStatus, space;
private JPanel filePanel;
private JButton saveButton;
private JProgressBar fileProgressBar;

Socket sockets;
private boolean isConnected;

JFileChooser fc;
String filePaths;
String fileName;
float filelength;
int result;

public Client(String title) throws Exception {
super(title);
setLayout(new BorderLayout());

saveButton = new JButton("接收");
saveButton.addActionListener(new SaveFile());

filePath = new JLabel("path");//路径
fileStatus = new JLabel("sta");//传输状态
fileSendRate = new JLabel("filesendrate");//传输速度
space = new JLabel();

fileProgressBar = new JProgressBar(0, 100);//进度条
fileProgressBar.setStringPainted(true);

filePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

filePanel.add(saveButton);
getContentPane().add(filePanel, BorderLayout.NORTH);
getContentPane().add(fileProgressBar, BorderLayout.SOUTH);

getContentPane().add(filePath);
getContentPane().add(fileStatus);
getContentPane().add(fileSendRate);
getContentPane().add(space);

fileStatus.setBounds(100, 90, 200, 20);
filePath.setBounds(100, 50, 200, 20);
fileSendRate.setBounds(100, 150, 200, 20);
space.setBounds(100, 180, 200, 20);

setBounds(100, 100, 300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

sockets = new Socket("localhost", 8989);
System.out.println("已连接");
JOptionPane.showMessageDialog(null, "已与服务器连接", "提示", 2);
isConnected = true;
}

class SaveFile implements ActionListener {

public void actionPerformed(ActionEvent e) {
isConnected = true;
if (isConnected == true) {

fc = new JFileChooser();
result = fc.showSaveDialog(saveButton);
File file1 = fc.getSelectedFile();

filePaths = file1.getAbsolutePath();
System.out.println("filePath:" + filePaths);
fileName = file1.getName();
filePath.setText(fileName);
if (file1 != null && result == JFileChooser.APPROVE_OPTION) {
Runnable run = new Runnable() {
public void run() {
try {
int passed = 0;
fileProgressBar.setValue(0);
File file2 = new File(filePaths);
file2.createNewFile();

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

InputStream netIn = sockets.getInputStream();
DataInputStream in = new DataInputStream(
new BufferedInputStream(netIn));

long filelength = in.readLong();
System.out.println("要接收的文件长度为" + filelength
+ "字节");

byte[] buf = new byte[1024 * 128];
int num = in.read(buf);
passed = 0;
while (num != (-1)) {
raf.write(buf, 0, num);
raf.skipBytes(num);
passed += num;
num = in.read(buf);

final int x = (int) (100 * (passed / (double) filelength));

if (x == 0) {
fileStatus.setText("对方正在等待你的接收");
} else if (x == 100) {
fileStatus.setText("你已经成功接收");

} else {
fileStatus.setText("正在接收中");
}

fileSendRate.setText(passed + "字节/"
+ filelength + "字节");

SwingUtilities.invokeLater(new Runnable() {
public void run() {
fileProgressBar.setValue(x);
fileProgressBar.setString(String
.valueOf(x)
+ "%");

}
});

}

in.close();
raf.close();

System.out.println("文件已收到");

} catch (Exception ex) {

}
}
};

Thread t = new Thread(run);
t.start();

}
if (result == JFileChooser.CANCEL_OPTION) {

}
}
isConnected = false;
}
}

public static void main(String[] args) throws Exception {

new Client("文件传输客户端");
}
}


为什么第二次传输的时候候传输为0kb??????
...全文
267 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
失意 2013-05-13
  • 打赏
  • 举报
回复
把客户端的关闭注释掉可以多次传输吧
 
 
in.close();      
raf.close();                    
System.out.println("文件已收到"); 

刚试了下
望舒 2013-05-13
  • 打赏
  • 举报
回复
你家的流被关掉了
dongrideshui 2013-05-07
  • 打赏
  • 举报
回复
引用 6 楼 lcf 的回复:
好吧我贴错了。是这里:
                    if (x == 0) {
                    fileStatus.setText("等待对方接受");
                    } else if (x == 100) {
                    fileStatus.setText("对方接受完毕");
                    fos.close();
                    doc.close();
还是不能重复传输
lcf 2013-05-07
  • 打赏
  • 举报
回复
好吧我贴错了。是这里:
                    if (x == 0) {
                    fileStatus.setText("等待对方接受");
                    } else if (x == 100) {
                    fileStatus.setText("对方接受完毕");
                    fos.close();
                    doc.close();
dongrideshui 2013-05-07
  • 打赏
  • 举报
回复
引用 4 楼 lcf 的回复:
                in.close();
                raf.close();
 
                System.out.println("文件已收到");
这可是你自己关闭的,哪有自动关闭
之前是屏蔽了的,没效果啊,然后又关闭了。
lcf 2013-05-07
  • 打赏
  • 举报
回复
                in.close();
                raf.close();
 
                System.out.println("文件已收到");
这可是你自己关闭的,哪有自动关闭
dongrideshui 2013-05-07
  • 打赏
  • 举报
回复
引用 1 楼 abcmsnet 的回复:
代码看着累,负责接待和负责发送的socket不是一个你能做到就好办了,
菜鸟刚刚开始,请问一下,是什么原因造成的呢?传输一次后socket就自动关闭了
dongrideshui 2013-05-07
  • 打赏
  • 举报
回复
引用
代码看着累,负责接待和负责发送的socket不是一个你能做到就好办了,
菜鸟刚刚开始,请问一下,是什么原因造成的呢?传输一次后socket就自动关闭了
  • 打赏
  • 举报
回复
代码看着累,负责接待和负责发送的socket不是一个你能做到就好办了,

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧