Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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
Java中通过套接字进行文件传输,不会超出while循环_Java_Sockets_Stream - Fatal编程技术网

Java中通过套接字进行文件传输,不会超出while循环

Java中通过套接字进行文件传输,不会超出while循环,java,sockets,stream,Java,Sockets,Stream,我正在尝试创建一个简单的服务器客户端程序,用户可以在其中上载和下载文件。我已经让套接字和流工作,我可以上传一个文件到服务器。但每当上传一个文件时,服务器端似乎陷入了读取流并将其转发到服务器文件的循环中 InputStream in = clientSocket.getInputStream(); String filePath = "......." + op[1]; System.out.println(op[0] + ": " + file

我正在尝试创建一个简单的服务器客户端程序,用户可以在其中上载和下载文件。我已经让套接字和流工作,我可以上传一个文件到服务器。但每当上传一个文件时,服务器端似乎陷入了读取流并将其转发到服务器文件的循环中

    InputStream in = clientSocket.getInputStream();

    String filePath = "......."
            + op[1];

    System.out.println(op[0] + ": " + filePath);

    FileOutputStream out = new FileOutputStream(filePath);

    byte[] bytes = new byte[16*1024];

    int count;

    while ((count = in.read(bytes)) > 0) {
        out.write(bytes, 0, count);
    }
服务器代码:

    InputStream in = clientSocket.getInputStream();

    String filePath = "......."
            + op[1];

    System.out.println(op[0] + ": " + filePath);

    FileOutputStream out = new FileOutputStream(filePath);

    byte[] bytes = new byte[16*1024];

    int count;

    while ((count = in.read(bytes)) > 0) {
        out.write(bytes, 0, count);
    }
客户端代码:

    InputStream in = clientSocket.getInputStream();

    String filePath = "......."
            + op[1];

    System.out.println(op[0] + ": " + filePath);

    FileOutputStream out = new FileOutputStream(filePath);

    byte[] bytes = new byte[16*1024];

    int count;

    while ((count = in.read(bytes)) > 0) {
        out.write(bytes, 0, count);
    }
    String filePath = "...."
            + path;
    System.out.println("Attempting: " + filePath);

    dos = new DataOutputStream(serverSocket.getOutputStream());
    fis = new FileInputStream(filePath);

    byte[] buffer = new byte[4096];

    while (fis.read(buffer) > 0) {
        dos.write(buffer);
    }

    dos.flush();
    fis.close();

问题是程序在while循环中卡住了,因此服务器无法执行其他任何操作。没有错误或任何东西…

您永远不会在客户端关闭流。在
dos.flush()之后添加
dos.close()

谢谢,这让程序退出while循环。但是,客户端和服务器之间的套接字连接也已关闭。我想有一个程序,我可以上传连续3个文件,如果我关闭每次上传后,我将不得不再次连接插座。有没有办法解决这个问题,或者我应该只为每个请求连接到服务器?您可能需要定义一个协议,允许服务器识别文件边界。例如,您可以设置流,以便在发送每个文件之前确定文件大小。服务器读取循环需要考虑这一点。我假设您正在做一个学习练习,因为存在各种带有“现成”Java实现的文件传输协议。
    InputStream in = clientSocket.getInputStream();

    String filePath = "......."
            + op[1];

    System.out.println(op[0] + ": " + filePath);

    FileOutputStream out = new FileOutputStream(filePath);

    byte[] bytes = new byte[16*1024];

    int count;

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