java - 线程化java服务器只发送一个文件

标签 java multithreading sockets

我有一个 java 服务器,可以将文件发送到 android 客户端。由于某种原因,服务器似乎只在一次通过后关闭套接字,我希望它发送所有文件然后关闭套接字,这是我的服务器代码。提前致谢

public void run() {
   DataOutputStream dos = null;
    try {
        String path = "/home/test";
        int count = 0;
        dos = new DataOutputStream(
                new BufferedOutputStream(socket.getOutputStream()));
        DataInputStream dis = new DataInputStream(new BufferedInputStream(
                socket.getInputStream()));

        File[] files = new File(path).listFiles();
        for (File file : files) {
            String filename = file.getName();
            String extension = filename.substring(
                    filename.lastIndexOf(".") + 1, filename.length());
            if ("png".equals(extension)) {
                count += 1;
            }

        }
        System.out.println("Sending " + count + " files");
        dos.writeInt(count);
        dos.flush();
        byte[] temp = new byte[1024];
        int n = 0;
        for (File file : files) {
            String filename = file.getName();
            String extension = filename.substring(
                    filename.lastIndexOf(".") + 1, filename.length());
            if ("png".equals(extension)) {
                FileInputStream fis = new FileInputStream(file);
                BufferedInputStream bis = new BufferedInputStream(fis);
                byte fileContent[] = new byte[(int) file.length()];
                bis.read(fileContent);
                int dataLength = fileContent.length;
                dos.writeInt(dataLength);
                dos.flush();
                int open = dis.readInt();
                System.out.println("still open if open = 5: open = "+open);
                System.out.println(filename + " is " + dataLength
                        + " bytes long");
                while ((dataLength > 0)
                        && (n = bis.read(temp, 0,
                                (int) Math.min(temp.length, dataLength))) != -1) {
                    dos.write(temp, 0, n);
                    dos.flush();
                    dataLength -= n;

                }
                System.out.println("Sent file "+filename);
                fis.close();
                bis.close();

            }
        }

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

        try{
        if (dos != null) {dos.close();}
        } catch (Exception e) {

            e.printStackTrace();
        }
    }
}

}

最佳答案

您的 Android 应用程序有可能正在旋转吗?您的代码中有逻辑错误。它将整个文件读入 fileContent 中,但随后您进入 while 循环等待文件被完全读取。

bis.read(fileContent);
...
while ((dataLength > 0)
    && (n = bis.read(temp, 0, (int) Math.min(temp.length, dataLength))) != -1) {

您已经从 bis 读取了整个文件,因此当您阅读更多内容时,您将得到 n == 0,因此它会永远循环。

如果你想进行缓冲,那么你应该删除bis.read(fileContent);。如果您想在开始时读取文件,那么您需要删除 while 循环。

int dataLength = (int) file.length();
byte fileContent[] = new byte[dataLength];
bis.read(fileContent);
dos.writeInt(dataLength);
dos.write(fileContent);
dos.flush();
dataLength -= n;

关于java - 线程化java服务器只发送一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733997/

相关文章:

java - Sikulix Maven 项目

Java从传入的对象设置 super 扩展类

java - 如果发生 onTick 中的条件,则停止 Count DownTimer,然后调用其 onFinish 方法

ruby-on-rails - 多进程VS多线程服务器最受益于什么?

java - 用于高延迟连接的 sslsocket session 机制

java - 热插拔 ServerSocket (Java)

java - 带有java客户端的python套接字服务器-socket.error : [Errno 32] Broken pipe

java - Android 中带有图像和文本的 ListView

java - 如何在 LinearLayout 中隐藏部分可见的 View ?

c++ - 有什么方法可以从文件 C++ 中自动读取一行