Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/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
通过WAN发送文件卡住(Java套接字)_Java_Sockets_Client Server_Lan_Wan - Fatal编程技术网

通过WAN发送文件卡住(Java套接字)

通过WAN发送文件卡住(Java套接字),java,sockets,client-server,lan,wan,Java,Sockets,Client Server,Lan,Wan,通过使用java套接字在Internet上发送文件,我遇到了一个非常奇怪的问题。我有一个Java服务器,在局域网中工作得很好,它可以通信和传输文件。 WAN中存在问题:当我在远程PC上运行服务器时,客户端可以与服务器通信,但当服务器尝试向服务器发送文件时,客户端将停留在0%。它通常发生在大文件(>=100 MB)上,但有时也发生在小文件上 请有人帮帮我:),谢谢 服务器接收代码: public void ReceiveFile(int fileSize, Socket sock, String

通过使用java套接字在Internet上发送文件,我遇到了一个非常奇怪的问题。我有一个Java服务器,在局域网中工作得很好,它可以通信和传输文件。 WAN中存在问题:当我在远程PC上运行服务器时,客户端可以与服务器通信,但当服务器尝试向服务器发送文件时,客户端将停留在0%。它通常发生在大文件(>=100 MB)上,但有时也发生在小文件上

请有人帮帮我:),谢谢

服务器接收代码:

public void ReceiveFile(int fileSize, Socket sock, String fileName, String cmrId, PrintWriter pw){
    folderCheck(cmrId);
    FileOutputStream fos= null;
    BufferedOutputStream bos= null;
    try {
        int ret;
        int bytesRead=0;
        fos= new FileOutputStream(cmrId+"/"+fileName);  //receive file to User Dedicated folder
        bos= new BufferedOutputStream(fos);
        //InputStream input= sock.getInputStream();
        byte[] bytesArray= new byte[fileSize];
        DataInputStream dis= new DataInputStream(sock.getInputStream());

        ret= dis.read(bytesArray, 0, bytesArray.length);
        bytesRead= ret;
        //System.out.println("CmrFoldMan -- Received " + bytesRead + " of " + fileSize);  //debug
        while(bytesRead<fileSize){
            ret= dis.read(bytesArray, bytesRead, (bytesArray.length-bytesRead));
            if(ret>=0) bytesRead+=ret;
            //System.out.println("CmrFoldMan -- Received " + bytesRead + " of " + fileSize);  //debug
        }
        bos.write(bytesArray, 0, bytesRead);
        bos.flush();

        upHist= new UpdateHistory(fileName, fileSize, cmrId);
        upHist.update();

        daysLimit.deleteFilesLimit(fileSize, cmrId);  //delete files that exceed memory limit


    } catch (IOException ex) {
        Logger.getLogger(CmrFolderManager.class.getName()).log(Level.SEVERE, null, ex);
    }
    finally{
        try {
            fos.close();
            bos.close();
        } catch (IOException ex) {
            Logger.getLogger(CmrFolderManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

嗯。。。首先。。。据我所知,在接收代码中,您正在创建一个字节数组,它是目标文件的大小

byte[] bytesArray= new byte[fileSize];
然后继续从输入流中读取,直到字节数组满为止

while(bytesRead<fileSize){
        ret= dis.read(bytesArray, bytesRead, (bytesArray.length-bytesRead));
正如您所描述的,对于100MB文件,这意味着您在内存中保留了100MB。这不是。。。好主意

fos= new FileOutputStream(cmrId+"/"+fileName);
InputStream is = sock.getInputStream());

int read = 0;
byte[] buf = new byte[1024];
while( (read = is.read(buf)) != -1) {
    fos.write(buf, 0, read);
}
上面的代码抛弃了您正在使用的DataInputStream(据我所知,它没有添加任何内容),一次最多读取1024个字节,并将其分块写入FileOutputStream,而不会在内存中保存超过1 KB的数据。试一试,看看它是否更可靠

bos.write(bytesArray, 0, bytesRead);
fos= new FileOutputStream(cmrId+"/"+fileName);
InputStream is = sock.getInputStream());

int read = 0;
byte[] buf = new byte[1024];
while( (read = is.read(buf)) != -1) {
    fos.write(buf, 0, read);
}