【问题标题】:File Transfer malformed input文件传输格式错误的输入
【发布时间】:2017-10-31 18:21:59
【问题描述】:

目前正在尝试让服务器向客户端发送文件。

我可以看到正在客户端目录中创建的文件,但它不会发送所有字节。有时是 90% 的字节,有时甚至不到 10 个字节。

我不断从终端窗口收到一条消息:“字节周围的输入格式错误......”

这是本节的服务器代码:

String cMessage;
DataInputStream input= new DataInputStream( remote_socket.getInputStream() );   

File filename = new File(cMessage);

try {
    input = new DataInputStream(new FileInputStream(filename));
    DataOutputStream out = new DataOutputStream(remote_socket.getOutputStream());

    byte[] buffer = new byte[(int) filename.length()];
    int count;
    while((count = input.read(buffer)) >0){
        out.write(buffer, 0, count);
    }

    System.out.println("Sending " + cMessage + " that is " + filename.length());
    out.flush();

} catch (IOException e) {
    System.out.println(e + "......");
    e.printStackTrace();
}

运行时服务器的输出如下所示: 发送 test.png 即 723915

这是本节的客户端:

try {
    BufferedReader reader= new BufferedReader( 
         new InputStreamReader(System.in) );
    String message;
    BufferedReader fileMessageReader= new BufferedReader( 
             new InputStreamReader(System.in) );
    String fileMessage;

    DataOutputStream output= new DataOutputStream(this.client_socket.getOutputStream() );
    DataInputStream input = new DataInputStream(this.client_socket.getInputStream());

    while(true) {
        while( (message = reader.readLine()) != null ) {

            System.out.println("1. For a text message. 2. For a file");

            if (message.equals("2")) {

                System.out.println("Name of file?");
                fileMessage = fileMessageReader.readLine();
                output.writeUTF(fileMessage);

                try {

                    File filename = new File(fileMessage);
                    DataOutputStream fileOutput = new DataOutputStream(new FileOutputStream(filename));

                    byte[] buffer = new byte[1024];
                    int count;
                    while((count = input.read(buffer)) >0){
                        fileOutput.write(buffer, 0, count);
                    }

                    fileOutput.flush();
                    fileOutput.close();

                } catch (IOException e) {
                    System.out.println(e + "...");
                }

            } else {    
                output.writeUTF( message );
            }

        }

    }

    } catch (Exception e) {
    System.out.println(e.getMessage());
    }

【问题讨论】:

  • 试试output.writeUTF(fileMessage.getBytes("UTF-8"));output.writeUTF(message.getBytes("UTF-8"));
  • DataOutputStream 类型中的 writeUTF(String) 方法不适用于参数 (byte[]) :(

标签: java file sockets p2p


【解决方案1】:

while ((c = input.read()) != -1) { output.write(c); } 这件作品正在扼杀它。如果您仔细阅读 javadoc,而不仅仅是检查方法签名,您将看到 read() 从输入中读取单个 byte(它返回 int 只是为了能够用 -1 表示流结束)。所以你把byte读成int,没什么大不了的,但是你盲目地将前面提到的int(4字节)写入输出流。

您应该改用read(byte[] b),然后写入整个数组(或仅写入上一轮读取的部分数组)。

【讨论】:

  • 刚刚更新了代码。可能误会了你,但有机会时看看。顺便说一句,同样的错误。
  • 嗯,按照stackoverflow.com/questions/25897627/… 尝试将read() 更改为readFully()
猜你喜欢
  • 2022-08-04
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2013-11-18
相关资源
最近更新 更多