服务器通过套接字发送数据,但客户端没有接收数据(Java)

服务器通过套接字发送数据,但客户端没有接收数据(Java),java,sockets,Java,Sockets,我正在用Java编写一个文件存储和传输系统。以下是客户端接收文件的代码: public static void receiveFile(Socket socket) throws IOException{ String fileLocation="/home/limafoxtrottango/Downloads/receivedFile"; int bytesRead=0; int current = 0; FileOutputStream fileOutp

我正在用Java编写一个文件存储和传输系统。以下是客户端接收文件的代码:

public static void receiveFile(Socket socket) throws IOException{   
    String fileLocation="/home/limafoxtrottango/Downloads/receivedFile";
    int bytesRead=0;
    int current = 0;
    FileOutputStream fileOutputStream = null;
    BufferedOutputStream bufferedOutputStream = null;

    try {
        // receive file
        byte [] byteArray  = new byte [60022386];
        System.out.println("Waiting to receive a file...");
        //reading file from socket
        InputStream inputStream = socket.getInputStream();
        fileOutputStream = new FileOutputStream(fileLocation);
        bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        bytesRead = inputStream.read(byteArray,0,byteArray.length);                 //copying file from socket to byteArray
        current = bytesRead;
        do {
            bytesRead =inputStream.read(byteArray, current, (byteArray.length-current));
            if(bytesRead >= 0) current += bytesRead;
        } while(bytesRead > -1);
        bufferedOutputStream.write(byteArray, 0 , current);                         //writing byteArray to file
        bufferedOutputStream.flush();                                               //flushing buffers

        System.out.println("File " + fileLocation  + " downloaded ( size: " + current + " bytes read)");
    } catch(SocketException e){
        System.out.println("Some error occured");
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally {
        if (fileOutputStream != null) fileOutputStream.close();
        if (bufferedOutputStream != null) bufferedOutputStream.close();
        if (socket != null) socket.close();
    }
}
在接收文件时,出现以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
    at java.lang.System.arraycopy(Native Method)
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:128)
    at Test.receiveFile(Test.java:211)
    at Test.main(Test.java:70)
注意:错误在以下代码行中:

bufferedOutputStream.write(byteArray, 0 , current);  
调试之后,我发现客户端的输入流中没有任何数据,因此read()方法总是返回-1(eof)。但是服务器正在成功发送文件

以下是服务器的代码:

public static void sendFile(Socket socket, String fileLocation)
{
    FileInputStream fileInputStream = null;
    BufferedInputStream bufferedInputStream = null;
    OutputStream outputStream = null;
    File file = new File (fileLocation);
    byte [] byteArray  = new byte [(int)file.length()];
    try {
        socket=new Socket(socket.getInetAddress(),port_no);
        fileInputStream = new FileInputStream(file);
        bufferedInputStream = new BufferedInputStream(fileInputStream);
        bufferedInputStream.read(byteArray,0,byteArray.length); // copied file into byteArray

        //sending file through socket
        outputStream = socket.getOutputStream();
        System.out.println("Sending " + fileLocation + "( size: " + byteArray.length + " bytes)");
        outputStream.write(byteArray,0,byteArray.length);           //copying byteArray to socket
        outputStream.flush();                                       //flushing socket
        System.out.println("Done sending!");    
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
下面是我对上述方法的调用:

sendFile(clientSocket, "/home/limafoxtrottango/Downloads/serverDownloads/"+sender);
问题是服务器正在成功地将字节写入流中,但是客户端的输入流中似乎没有任何数据

inputStream.read(byteArray,0,byteArray.length);在上述文档中给出的某些情况下,可能返回-1。请考虑这种情况

此外,我建议对客户端和服务器使用此处给出的解决方案:

客户端代码:

final Path destination = Paths.get(fileLocation);
try (
    final InputStream in = socket.getInputStream();
) {
    Files.copy(in, destination);
}
服务器代码:

try (
    final InputStream in = new FileInputStream(fileLocation);
) {
    Files.copy(in, socket.getOutputStream());
}
亲切问候,,
巴拉

服务器没有发送任何内容,与您的标题相反。它会立即关闭连接,因此
bytesRead
最初为-1且从不更改,并且您不会对此进行防御,因此您会获得
ArrayIndexOutOfBoundsException

然而,在您发布的代码中,服务器正在发送一些东西,但从未关闭套接字,这是您需要修复的另一个错误。它还忽略了由
FileInputStream.read()
返回的计数,并假设它填充了缓冲区,而缓冲区不是规范的一部分

因此,要么这不是真正的服务器代码,要么你正在连接其他东西,要么服务器得到了一个你没有提到的
IOException

奇怪的是,您使用两段不同的代码进行复制。在Java中复制流的标准方法如下:

char buffer = new char[8192]; // or whatever size you prefer > 0
int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

两头都用这个。不需要使用大尺寸的缓冲区,也不需要缓冲文件的大小,也不需要假设文件大小与IDE调试器中的代码相匹配。通过这种方式,你会学到比我们告诉你出了什么问题更多的东西。无关评论:这就是为什么不应该使用标签。它在每一个编辑器中呈现的方式都不一样,这使得现在在SODebugging上缩进代码的人生活在地狱中。这是我第一次使用IDE的这个功能,多亏了Jim Garrison。@Jim Garrison,我发现输入流中没有数据,因为读取的字节数总是-1(这意味着它已经到达eof)。这可能意味着服务器没有发送任何数据。但我肯定是的。你能帮我吗?我读了文档,它说当方法到达eof时返回-1。因为它总是返回-1,我猜它没有在流中接收任何数据。至于第二种解决方案,我将尝试一下。另外,使用第二种方法,下载的文件大小为0B。所以,我想没有数据可以复制到文件中。@PrashantPandey如果您的服务器一直在套接字中提供0字节,那么我相信问题不在代码范围之内。但是,最好保留此代码中针对此类情况的所有检查。:)我已经为服务器添加了代码。您能看一下吗?我假设您的sendFile(Socket,String)方法在调用ServerSocket对象上的accept之后接收Socket对象。如果没有,请尝试并让我们知道。accept方法将等待客户端启动并请求在此服务器的主机和端口上建立连接。@请解释。还是只是破坏网站?现在就实施更改。我想我已经很久没有看服务器代码了。它确实包含一些非常幼稚的错误。这很尴尬。