问题通过java套接字顺序传输多个文件

时间:2014-04-07 03:11:46

标签: java

我希望有人能够注意到我没注意到的东西。我目前正在为大学的项目开发一个系统,它涉及创建一个可以在彼此之间传输文件的Android应用程序和java程序。在这个特定的用例中,两个程序都知道以下细节:将要发送的文件数,每个文件的大小以及它们将被发送的顺序。

这是我的Android应用程序中的代码:

try {
        Socket socket = new Socket(ip, port);
        ObjectOutputStream requestStream = new ObjectOutputStream(
                socket.getOutputStream());
        DataInputStream contentStream = new DataInputStream(
                socket.getInputStream());

        requestStream.writeObject(request);


        byte[] buf;
        File saveFile;
        for (File f : request.getFiles()) {
            saveFile = new File(saveLoc + f.getName());

            FileOutputStream outputStream = new FileOutputStream(saveFile);

            int count = 0;

            buf = new byte[4096];

            long length = request.getFileSize(f.getName());
            while ((count = contentStream.read(buffer, 0,
                    (int) (Math.min(buffer.length, length-newFile.length())))) > 0) {
                outputStream.write(buffer, 0, count);
                outputStream.flush();
            }

            outputStream.close();
        }
        contentStream.close();
        socket.close();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

这是我的电脑程序中的代码:

try
    {
        DataOutputStream output = new DataOutputStream(socket.getOutputStream());
        DataInputStream syncStream = new DataInputStream(socket.getInputStream());
        byte[] buffer;

        for(File f : request.getFiles())
        {
            buffer = new byte[4096];
            FileInputStream fileInput = new FileInputStream(f);
            int count = 0;
            while((count = fileInput.read(buffer)) > -1)
            {
                output.write(buffer,0,count);
                output.flush();
            }
            fileInput.close();
        }
        output.close();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

}

我最初的问题是所有字节都将被发送到Android应用程序并保存到传输队列中的第一个文件,从而产生一个大文件和多个空文件。然后我改变了一些流代码以使用涉及偏移/长度的方法,因为我在另一个线程中读取可能解决我的问题。然而,我当前的问题是,虽然队列中的第一个文件使用正确的字节数写入,但后续项目与它们应该的数量相差很少。我很确定我在偏移/长度部分出错了,但我对套接字编程的经验有限。

另外,这是pc程序中的堆栈跟踪。似乎应用程序在服务器完成数据发送之前关闭套接字。

java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at java.io.FilterOutputStream.write(FilterOutputStream.java:97)
at com.sebastianmgibbs.QRBeam.pc.controller.ClientTransferController.transfer(ClientTransferController.java:66)
at com.sebastianmgibbs.QRBeam.pc.controller.ClientTransferController.run(ClientTransferController.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

0 个答案:

没有答案