【问题标题】:Java sending and receiving file over socketsJava 通过套接字发送和接收文件
【发布时间】:2016-12-08 13:09:15
【问题描述】:

我目前正在尝试创建一个文件传输程序,该程序可以将文件从一个位置传输到另一个位置。该程序适用于 .txt 文件,但对于其他扩展名,例如 .exe,传输的文件无法正常打开。有人能发现我的代码的问题吗?谢谢!

服务器代码:

import java.io.*;
import java.net.*;

public class SendFile{
    static ServerSocket receiver = null;
    static OutputStream out = null;
    static Socket socket = null;
    static File myFile = new File("C:\\Users\\hieptq\\Desktop\\AtomSetup.exe");
    /*static int count;*/
    static byte[] buffer = new byte[(int) myFile.length()];
    public static void main(String[] args) throws IOException{
        receiver = new ServerSocket(9099);
        socket = receiver.accept();
        System.out.println("Accepted connection from : " + socket);
        FileInputStream fis = new FileInputStream(myFile);
        BufferedInputStream in = new BufferedInputStream(fis);
        in.read(buffer,0,buffer.length);
        out = socket.getOutputStream();
        System.out.println("Sending files");
        out.write(buffer,0, buffer.length);
        out.flush();
        /*while ((count = in.read(buffer)) > 0){
            out.write(buffer,0,count);
            out.flush();
        }*/
        out.close();
        in.close();
        socket.close();
        System.out.println("Finished sending");



    }

}

客户端代码:

import java.io.*;
import java.net.*;

public class ReceiveFile{
    static Socket socket = null;
    static int maxsize = 999999999;
    static int byteread;
    static int current = 0;
    public static void main(String[] args) throws FileNotFoundException, IOException{
        byte[] buffer = new byte[maxsize];
        Socket socket = new Socket("localhost", 9099);
        InputStream is = socket.getInputStream();
        File test = new File("D:\\AtomSetup.exe");
        test.createNewFile();
        FileOutputStream fos = new FileOutputStream(test);
        BufferedOutputStream out = new BufferedOutputStream(fos);
        byteread = is.read(buffer, 0, buffer.length);
        current = byteread;

        do{
            byteread = is.read(buffer, 0, buffer.length - current);
            if (byteread >= 0) current += byteread;
        } while (byteread > -1);
        out.write(buffer, 0, current);
        out.flush();

        socket.close();
        fos.close();
        is.close();

    }
}

【问题讨论】:

    标签: java sockets server client


    【解决方案1】:

    一个问题是您在从 InputStream 读取时覆盖了 buffer 的内容

        byteread = is.read(buffer, 0, buffer.length);
        current = byteread;
    
        do{
            byteread = is.read(buffer, 0, buffer.length - current);
            if (byteread >= 0) current += byteread;
        } while (byteread > -1);
    

    InputStream#read 将第二个参数声明为偏移量,它将存储在字节数组中,在您的情况下,偏移量始终为 0,因此它将在每次迭代中覆盖。

    我建议简化从 InputStream 读取和写入 OutputStream 的逻辑

    byte[] buffer = new byte[16384];
    
    while ((byteread = is.read(buffer, 0, buffer.length)) != -1) {
      out.write(buffer, 0, byteread);
    }
    
    out.flush();
    

    希望这会有所帮助。

    【讨论】:

    • 很高兴能帮到你:)
    猜你喜欢
    • 2020-12-21
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2013-09-11
    相关资源
    最近更新 更多