文件传输格式错误的输入

时间:2017-05-31 05:32:43

标签: java file sockets p2p

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

我能够在客户端目录中看到正在创建的文件,但它不会发送所有字节。有时它的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());
    }

1 个答案:

答案 0 :(得分:0)

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

您应该使用read(byte[] b)代替然后编写整个数组(或者只是在上一轮中读取的部分数组)。