Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-OutofMemory客户机/服务器应用程序_Java_Sockets_Memory Leaks_Out Of Memory - Fatal编程技术网

Java-OutofMemory客户机/服务器应用程序

Java-OutofMemory客户机/服务器应用程序,java,sockets,memory-leaks,out-of-memory,Java,Sockets,Memory Leaks,Out Of Memory,我正在构建一个可以在远程计算机上运行的备份服务器。我想现在的问题是我的内存泄漏了。传输大文件时,一段时间后会出现以下错误: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149) at java.lang.StringCoding.decode(String

我正在构建一个可以在远程计算机上运行的备份服务器。我想现在的问题是我的内存泄漏了。传输大文件时,一段时间后会出现以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149)
    at java.lang.StringCoding.decode(StringCoding.java:193)
    at java.lang.StringCoding.decode(StringCoding.java:254)
    at java.lang.String.<init>(String.java:536)
    at java.lang.String.<init>(String.java:556)
    at Server.run(Server.java:61)
    at Server.main(Server.java:107)
线程“main”java.lang.OutOfMemoryError中的异常:java堆空间 在java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149) 在java.lang.StringCoding.decode(StringCoding.java:193) 在java.lang.StringCoding.decode(StringCoding.java:254) 位于java.lang.String。(String.java:536) 位于java.lang.String。(String.java:556) 运行(Server.java:61) 位于Server.main(Server.java:107) 我已经读了一些关于这方面的文章,但没有一篇真正给了我解决这个问题的答案。代码在下面。提前谢谢

服务器:

private ServerSocket server;
private Socket acceptingSocket;

public Server(int port){
    try {
        server = new ServerSocket(port);
    } catch (IOException e) {
        System.out.println("Try again");
    }
}

/**
 * Reads all files and puts them in the back-up folder. Also creates the appropriate dirs.
 */
public void run(){
    BufferedInputStream buffer = null;
    DataInputStream reader = null;
    BufferedOutputStream out = null;
    DataOutputStream writer = null;
    int size = 0;
    try {
        acceptingSocket = server.accept();
        buffer = new BufferedInputStream(acceptingSocket.getInputStream());
        reader = new DataInputStream(buffer);
        out = new BufferedOutputStream(acceptingSocket.getOutputStream());
        writer = new DataOutputStream(out);
        size = reader.readInt();
    } catch (IOException e1) {
    }
    System.out.println("Size: " + size);
            //Variables I need later on, I thought this would help
    byte[] name;
    int fileNameLength = 0;
    long length=0;
    boolean dir  = false;
    int t = 0;
    String dirs = "";
    File direcs;
    File file;
    byte[] b;
    int bytes=0;
    for(int j = 0; j < size; j++){
        try {
            fileNameLength = reader.readInt();
            name = new byte[fileNameLength];
            reader.read(name, 0,fileNameLength);
            String path = new String(name);
            System.out.println("Path: " + path);
            length = reader.readLong();
            dir = reader.readBoolean();
            path = "/backup" + path;
            file = new File(path);
            if(!dir){
                t = file.getAbsolutePath().lastIndexOf("/");
                dirs = file.getAbsolutePath().substring(0, t);
                direcs = new File(dirs);
                System.out.println(direcs.mkdirs());
                FileOutputStream fos = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                b = new byte[(int) length];
                bytes = reader.read(b, 0, (int)length);
                if(bytes != -1)
                    bos.write(b,0,(int)length);                 

                writer.writeUTF("File " + file.getAbsolutePath() + " is created!");
                writer.flush();
                bos.flush();
                fos.flush();
                bos.close();
                fos.close();
                out.flush();

            } else file.mkdirs();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        buffer.close();
        reader.close();
        out.close();
        writer.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static void main(String[] args){
    int port = Integer.parseInt(args[0]);
    Server server = new Server(port);
    while(true)
        server.run();
}
私有服务器套接字服务器;
专用套接字接受套接字;
公共服务器(int端口){
试一试{
服务器=新的服务器套接字(端口);
}捕获(IOE异常){
System.out.println(“重试”);
}
}
/**
*读取所有文件并将其放入备份文件夹。还创建适当的目录。
*/
公开募捐{
BufferedInputStream buffer=null;
DataInputStream读取器=空;
BufferedOutputStream out=null;
DataOutputStream编写器=null;
int size=0;
试一试{
acceptingSocket=server.accept();
buffer=新的BufferedInputStream(acceptingSocket.getInputStream());
读卡器=新数据输入流(缓冲区);
out=新的BufferedOutputStream(acceptingSocket.getOutputStream());
writer=新数据输出流(out);
size=reader.readInt();
}捕获(IOE1异常){
}
System.out.println(“尺寸:+尺寸”);
//我以后需要的变量,我想这会有帮助
字节[]名称;
int fileNameLength=0;
长长度=0;
布尔dir=false;
int t=0;
字符串dirs=“”;
文件目录;
文件;
字节[]b;
int字节=0;
对于(int j=0;j
客户:

private DataInputStream serverToClient;
private Socket client;
private DataOutputStream clientToServer;
private String name;

public Client(String name, int port){
    try {
        client = new Socket(name, port);
        //receive response server
        serverToClient = new DataInputStream(client.getInputStream());
        //send message to server
        clientToServer = new DataOutputStream(client.getOutputStream());
        this.name = name;
    }
    catch (IOException e) {
    }
}

/**
 * Closes all connections
 */
public void stop(){

    try {
        client.close();
        serverToClient.close();
        clientToServer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * Sends all files and content of the files to the back-up server
 * @param filePath
 */
public void backUp(String filePath){
    ArrayList<File> files = new ArrayList<File>();
    boolean dir = false;
    long length = 0;
    byte[] buffer;
    try{
        listf(filePath, files, 0);
        System.out.println(files.toString());
        clientToServer.writeInt(files.size());

        for(File fi : files){
            dir = false;
            if(fi.isDirectory()) dir = true;
            clientToServer.writeInt(fi.getAbsolutePath().length());
            System.out.println(fi.getAbsolutePath().length());
            clientToServer.writeBytes(fi.getAbsolutePath());
            System.out.println(fi.getAbsolutePath());
            length = fi.length();
            clientToServer.writeLong(length);
            clientToServer.writeBoolean(dir);
            System.out.println("Dir? " + dir);
            System.out.println(length);
            if(!dir){
                FileInputStream fis = new FileInputStream(fi);
                BufferedInputStream bis = new BufferedInputStream(fis);

                buffer = new byte[(int)length];

                bis.read(buffer, 0, (int)length);
                clientToServer.write(buffer);
                System.out.println(serverToClient.readUTF());
                bis.close();
                fis.close();
                clientToServer.flush();
            }
        }

    } catch(IOException e){
        e.printStackTrace();
    }
}

/**
 * Get all files, folders and subfolders in the file specified by directoryName, recursively.
 * @param directoryName
 * @param files
 * @param size
 */
private void listf(String directoryName, ArrayList<File> files, int size) {
    File directory = new File(directoryName);
    size = files.size();
    if(size > 100){
        System.out.println(size);
        size += 100;
    }
    if(directory.isFile()) files.add(directory);
    else{
        File[] fList = directory.listFiles();
        for (File file : fList) {
            if(file.isDirectory() && file.listFiles().length == 0) files.add(file);
            else{
                if (file.isFile()) {
                    files.add(file);
                } else if (file.isDirectory()) {
                    listf(file.getAbsolutePath(), files, size);
                }
            }
        }
    }
}

public static void main(String[] args){
    String name = args[0];
    int port = Integer.parseInt(args[1]);
    System.out.println("Name: " + name + " Port: " + port);
    Client client = new Client(name, port);
    File file = new File(args[2]);
    if(file.exists())client.backUp(args[2]);
    else System.out.println("File doesn't exist");
    client.stop();

}
私有数据输入流服务器到客户端;
专用套接字客户端;
专用DataOutputStream客户端到服务器;
私有字符串名称;
公共客户端(字符串名称,int端口){
试一试{
客户端=新套接字(名称、端口);
//接收响应服务器
serverToClient=newDataInputStream(client.getInputStream());
//向服务器发送消息
clientToServer=newdataoutputstream(client.getOutputStream());
this.name=名称;
}
捕获(IOE异常){
}
}
/**
*关闭所有连接
*/
公共停车场(){
试一试{
client.close();
serverToClient.close();
clientToServer.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
/**
*将所有文件和文件内容发送到备份服务器
*@param文件路径
*/
公共无效备份(字符串文件路径){
ArrayList files=新的ArrayList();
布尔dir=false;
长长度=0;
字节[]缓冲区;
试一试{
listf(文件路径,文件,0);
System.out.println(files.toString());
clientToServer.writeInt(files.size());
用于(文件fi:文件){
dir=false;
如果(fi.isDirectory())dir=true;
clientToServer.writeInt(fi.getAbsolutePath().length());
System.out.println(fi.getAbsolutePath().length());
clientToServer.writeBytes(fi.getAbsolutePath());
System.out.println(fi.getAbsolutePath());
长度=fi.length();
clientToServer.writeLong(长度);
clientToServer.writebolean(dir);
System.out.println(“Dir?”+Dir);
系统输出打印长度;
如果(!dir){
FileInputStream fis=新的FileInputStream(fi);
BufferedInputStream bis=新的BufferedInputStream(fis);
缓冲区=新字节[(int)长度];
二读(缓冲区,0,(int)长度);
clientToServer.write(缓冲区);
System.out.println(serverToClient.readUTF());
二、关闭();
fis.close();
clientToServer.flush();
}
}
}捕获(IOE异常){
e、 printStackTrace();
}
while (total < length && (count = in.read(buffer, 0, length-total > buffer.length ? buffer.length : (int)(length-total))) > 0)