1

我正在实施两个程序;客户端和服务器,客户端向服务器请求文件以下载到本地文件系统中。

下载一个文件后,如果客户端愿意,它应该能够下载另一个文件。

但是,在下载文件后,服​​务器给了我一个异常说

java.net.SocketException: Socket closed

这是我的代码..

客户:

        byte[] aByte = new byte[0];
        int bytesRead;
        String msg;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        while (!(msg = input.readLine()).equals("end")) {

            String myFolderName = "ServerFolder";
            File folder=new File(myFolderName);   
            if (!folder.exists()){ 
                folder.mkdir();
            }
            System.out.println("file downloading");
            try {

                System.out.println("1");
                fos = new FileOutputStream("ServerFolder/"+fileToDownload);
                bos = new BufferedOutputStream(fos);

                System.out.println("MSG: "+msg);

                bytesRead = in.read(aByte, 0, aByte.length);

                System.out.println("2");



                do {
                    baos.write(aByte);
                    bytesRead = in.read(aByte);
                } while (bytesRead != -1);

                System.out.println("3");
                bos.write(baos.toByteArray());
                bos.flush();
            } catch (IOException ex) {
                System.err.println(ex.getMessage());
            }


        }
        bos.close();

    } catch (IOException ex) {
        System.err.println(ex);
    }    

服务器:

if (outToClient != null) {
                    System.out.println("2");
                    File myFile = new File(msg);
                    byte[] mybytearray = new byte[(int) myFile.length()];


                    try {
                        fis = new FileInputStream(myFile);
                    } catch (FileNotFoundException ex) {
                        // Do exception handling
                    }
                    System.out.println("3");
                    bis = new BufferedInputStream(fis);

                    try {
                        bis.read(mybytearray, 0, mybytearray.length);   

                        System.out.println("mybytearray.length: "+(int) myFile.length());
                        out.write((int) myFile.length()+"\r\n");    
                        out.write("end\r\n");
                        out.flush();


                        outToClient.write(mybytearray, 0, mybytearray.length);
                        outToClient.flush();

                        s.shutdownOutput();

                        outToClient.close();


                        System.out.println("4");

                    } catch (IOException ex) {
                        System.out.println("5");
                        System.err.println(ex);
                    }

(所有连接的东西都在每个方法的开头完成)

我有

s.close();

在服务器中但我删除了它以防万一它导致错误但它不是..

我假设

outToClient.close();

也不是造成的?...

我也用谷歌搜索了这个问题,有些人建议在服务器发送文件之前告诉客户端文件的大小..但效果不佳..所以我也删除了那部分(或者我做错了..)

谢谢:)

4

1 回答 1

3

java.net.SocketException:套接字关闭

这只有一个意思。您关闭了套接字,然后继续使用它。可能您不知道关闭 Socket 的输入或输出流会关闭另一个流和套接字。

您的代码中还有许多其他错误:您忽略了 read() 返回的值;当您可以直接写入目标时,您正在使用不必要的 BytearrayOutputStreams;等等等等。实在是不胜枚举。在 Java 中复制流的规范方法如下:

while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}

如果你想使用同一个连接来传输多个文件,你必须在文件之前发送文件的长度,以便对等方知道它何时读取了所有文件,使用上述循环的明显修改。DataOutputStream.writeLong()DataInputStream.readLong()提供最明显的方法。

于 2012-10-03T10:38:57.733 回答