我用java写了个文件传输软件,可是传输一些小的文件能够正常传输,但是当文件比较大的时候就出现下列问题! Exception in thread "Thread-5" java.lang.outofMemoryError: java heap space at transSocket.transclientSocket.run<transclientSocket.java;70>我在网上搜索了类似的问题,按照他们的说法在windows环境变量里加入JAVA_OPTS=-Xms64m -Xmx512m
可是还是不行!
我的问题是:小文件可以传输(10兆左右的),在大就出现上面问题,恳求高手指点,不胜感激!
可是还是不行!
我的问题是:小文件可以传输(10兆左右的),在大就出现上面问题,恳求高手指点,不胜感激!
try{System.out.println("address= "+address);
OutputStream out=socket.getOutputStream();
BufferedOutputStream buff=new BufferedOutputStream(out);
String st=this.getPath();System.out.println("st= "+st);
File file=new File(st);
String fileName=null;
if(file.isFile()&&file.exists()){
fileName=file.getName();System.out.println("fileName= "+fileName);
byte b[]=fileName.getBytes();
buff.write(b);
byte a[]="\n".getBytes();
buff.write(a);
}
else JOptionPane.showMessageDialog(null,"此文件是个目录或者不是个合法文件\n请重新确定你要传送的文件"
,"文件错误",JOptionPane.WARNING_MESSAGE );
ProgressMonitorInputStream pr=new ProgressMonitorInputStream(null,"reading the file",new FileInputStream(file));
ProgressMonitor prog=pr.getProgressMonitor();
// prog.setMillisToPopup(100);
prog.setMillisToDecideToPopup(10);
BufferedInputStream input=new BufferedInputStream(pr);
int length=0;
while((length=input.available())!=0){
byte[] c=new byte[length];
int j=input.read(c,0,c.length);
if(j!=-1){
buff.write(c);
}
}
input.close();
buff.close();
socket.close();
}
catch(IOException e3){
e3.printStackTrace();
}
}
还有一个问题,就是我添加的那个ProgressMonito查看传输进度的,怎么就不弹出进度窗口
java.net.socketException:software caused connection abort:socket write error
这又是怎么回事!
java.net.socketException:software caused connection abort:socket write error
这又是怎么回事!
你的代码不全啊
你后面改的话应该只传了那你分割后的第一个部分就把SOCKET关掉了!!
java.net.socketException:software caused connection abort:socket write error
这又是怎么回事!
byte[] c=new byte[1024];
int j=input.read(c,0,c.length);
if(j!=-1) {System.out.println(++d);
buff.write(c);
buff.flush();
}
}
int length=input.available();
byte[] c=new byte[length];
int j=input.read(c,0,c.length);
if(j!=-1){System.out.println("ccccccccccccccccccccccccccccc");
buff.write(c);buff.flush();
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;public class FileSender implements Runnable{
/**
* 文件发送类
* 主要用于将文件发送到特定的IP目的地
* 目前只支持单个文件发送
*/
private String serverIP; //服务器IP
private int port; //服务器端口
private Socket socket = null; //套接字
private DataOutputStream out = null;//数据输出流,用于将数据写入文件
private DataInputStream in = null; //数据输入流,从服务器获取数据输入流
private File file; //存放文件
private int bufferSize=1; //文件接收缓冲区大小,单位KB,默认为1KB
private int completed; //文件传输进度,0<completed<=100
private boolean stop=false; //停止接收文件标记
public FileSender() {} //默认构造函数
public FileSender(Socket socket,String ip, int port){
setSocket(socket); //设置套接字
setServerIP(ip); //设置服务器IP
setPort(port); //设置服务端口
}
public FileSender(Socket socket,String ip,int port,File file){
setSocket(socket); //设置套接字
setServerIP(ip); //设置服务器IP
setPort(port); //设置服务端口
setFile(file); //设置要发送的文件
}
public void run(){
/**
* 发送函数,覆盖run()方法
*/
try{
setIn(new DataInputStream( //设置数据输入流
new BufferedInputStream(getSocket().getInputStream())));
getIn().readByte();
DataInputStream fis = new DataInputStream( //设置文件输入流
new BufferedInputStream(new FileInputStream(getFile().getPath())));
setOut(new DataOutputStream(getSocket().getOutputStream()));
//发送输文件信息
getOut().writeUTF((getFile().getName())); //发送文件名
getOut().flush();
getOut().writeLong((long) getFile().length()); //发送文件长度
getOut().flush();
byte[] buf = new byte[getBufferSize()]; //创建缓冲区
//开始传送文件
long haveSent=0; //已发送数据量,以byte为单位
long fileLength=getFile().length();
while (!isStop()) {
int read = 0;
if (fis != null) {
read = fis.read(buf); //将部分文件数据读入缓冲区
}
if (read == -1) {break;} //读到文件结尾
getOut().write(buf, 0, read); //将读取的数据写入网络输出流
haveSent+=read; //计算已传送数据量,单位Byte
completed=(int)((100*haveSent)/fileLength); //获取文件传输进度,0<completed<=100
}//end while
getOut().flush();
fis.close(); //关闭文件输入流
getSocket().close(); //关闭socket
}catch(Exception e){
e.printStackTrace();
}
}//end run
public boolean shutDownConnection() {
/**
* 关闭连接方法
*/
try {
if (getOut() != null)
getOut().close(); //关闭输出流
if (getIn() != null)
getIn().close(); //关闭输入流
if (getSocket() != null)
getSocket().close(); //关闭Socket
return true; //连接关闭成功
} catch (Exception e) {
//System.out.println("连接关闭失败!");
e.printStackTrace();
return false;
}
} public String getServerIP() { //获取服务器IP
return serverIP;
}
public void setServerIP(String ip) { //设置服务器IP
this.serverIP = ip;
}
public int getPort() { //获得服务器端口
return port;
}
public void setPort(int port) { //设置服务端口
this.port = port;
}
public Socket getSocket() { //获得Socket
return socket;
}
public void setSocket(Socket socket) { //设置socket
this.socket = socket;
}
public DataOutputStream getOut() { //获取数据输出流
return out;
}
public void setOut(DataOutputStream out) { //设置数据输出流
this.out = out;
}
public DataInputStream getIn() { //获取数据输入流
return in;
}
public void setIn(DataInputStream in) { //设置数据输入流
this.in = in;
}
public String getFileName() { //获取文件名
return getFile().getName();
}
public int getBufferSize() { //获取缓冲区大小
return bufferSize;
}
public void setBufferSize(int bufferSize) { //设置缓冲区大小
this.bufferSize = bufferSize;
}
public int getCompleted() { //获取文件传输进度
return completed;
}
public boolean isStop() { //获取文件传输状态,是否已停止
return stop;
}
public void setStop(boolean stop) { //停止文件传输
this.stop = stop;
}
public File getFile() { //获取发送的文件
return file;
}
public void setFile(File file) { //设置待发送的文件
this.file = file;
}
}
这是我以前写的Java文件传输工具里面的文件发送类,LZ可以参考下,我就不解释了。完整的文件传输工具源代码我已经上传到我的CSDN资源里面,包括发送端和接收端,有界面,好久没更新了,源代码已经封装到jar文件里面了。