简体   繁体   English

通过 Java 套接字发送多个文件

[英]Sending Multiple Files Over a Java Socket

I am trying to get a program working where a client sends the same file to the server 100 times and then checks to make sure all 100 files are the same as the original.我试图让一个程序工作,其中客户端将相同的文件发送到服务器 100 次,然后检查以确保所有 100 个文件与原始文件相同。 Right now I cant get it to work because the server reads some arbitrary amount of bytes from the client and it causes some files to have too many bytes in them and I'm not sure how to proceed.现在我无法让它工作,因为服务器从客户端读取一些任意数量的字节,它导致一些文件中有太多字节,我不知道如何继续。 Right now it will send all 100 files properly but some files just have too much stuff in them.现在它将正确发送所有 100 个文件,但有些文件中的内容太多。

Client code客户端代码

String sentence;
    InetAddress host = InetAddress.getLocalHost();
    Socket clientSocket = new Socket(host, 6789);
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

    long startTime, endTime, tGap, totalTime;
    byte[] sendData;
    int filesSent = 0;

    File fs = new File("Test1.txt");

    int fileLength = (int) fs.length();
    totalTime = 0;

    while (filesSent < 100) {
        FileInputStream fin = new FileInputStream(fs);
        int numBytes = 0;
        System.out.println("Sending file to server...");
        sendData = new byte[1024];
        if (fileLength < 1024) {
            numBytes = fin.read(sendData, 0, fileLength);
        } else {
            numBytes = fin.read(sendData, 0, 1024);
        }

        startTime = System.currentTimeMillis();
        int count = 0;
        while (numBytes != -1) {
            count += numBytes;
            System.out.println(numBytes);
            sentence = new String(sendData);
            outToServer.writeBytes(sentence);
            numBytes = fin.read(sendData, 0, 1024);
        }
        System.out.println(count);
        endTime = System.currentTimeMillis();
        tGap = endTime - startTime;
        totalTime = totalTime + tGap;
        System.out.println("Finished run " + filesSent + " with a time of " + tGap);
        filesSent++;
        fin.close();
        outToServer.flush();
    }
    clientSocket.close();

    System.out.println("I am done to send " + filesSent + " times file, and the average time is: " + (double) totalTime / filesSent);
}

Server Code服务器代码

String clientSentence;
    int filesRecieved = 0;
    ServerSocket welcomeSocket = new ServerSocket(6789);
    int numError = 0;
    int numBytes;
    char check = 'a';
    System.out.println("I am starting now....");

    long startTime, endTime, tGap, totalTime;
    totalTime = 0;

    Socket connectionSocket;
    connectionSocket = welcomeSocket.accept();
    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

    while(filesRecieved < 100) {
        FileOutputStream outPut = new FileOutputStream("receivedFile" + filesRecieved + ".txt");
        char[] receiveData = new char[1024];
        numBytes = inFromClient.read(receiveData, 0, 1024);
        while(numBytes != 1024){
            numBytes += inFromClient.read(receiveData,0,1024-numBytes);
        }
        System.out.println("OG Bytes:" + numBytes);
        startTime = System.currentTimeMillis();

        int count = 0;
        while (numBytes != -1 && count < 105942) {
            try {
                count += numBytes;
                clientSentence = new String(receiveData, 0, numBytes);
                outPut.write(clientSentence.getBytes(), 0, numBytes);
                System.out.println(numBytes);
                numBytes = inFromClient.read(receiveData, 0, 1024);
                System.out.println(count);
            }catch(Exception e){
                break;
            }
        }
        outPut.close();
        endTime = System.currentTimeMillis();
        tGap = endTime - startTime;
        totalTime = totalTime + tGap;
        System.out.println("I have received" + "receivedFile" + filesRecieved + ".txt using time = " + tGap);
        filesRecieved++;
    }

    connectionSocket.close();

    System.out.println("I am done now..." + "and the average time used to receive each copy is: " + totalTime / filesRecieved);
    welcomeSocket.close();

TCP is a byte stream. TCP是字节流。 It has no concept of messages.它没有消息的概念。 As such, you need to frame the file data in such a way that the receiver knows where one file ends and the next begins.因此,您需要以接收者知道一个文件在哪里结束和下一个文件开始的方式来构建文件数据。 In this case, you need to send the file size before sending the file data, so the receiver knows how many bytes to expect per file.在这种情况下,您需要在发送文件数据之前发送文件大小,以便接收方知道每个文件需要多少字节。

Also, you are not paying attention properly to the number of bytes that read() tells you were actually read each time you call it.此外,您没有正确注意read()告诉您每次调用它时实际读取的字节数。 You are giving it a large buffer, but there is no guarantee that the entire buffer will be filled up.您为其提供了一个大缓冲区,但不能保证整个缓冲区都将被填满。 Especially at the end of a file.特别是在文件末尾。

And don't transfer binary file data using strings!并且不要使用字符串传输二进制文件数据!

Try something more like this instead:尝试更像这样的事情:

Client:客户:

File fs = new File("Test1.txt");
long fileLength = fs.length();

InetAddress host = InetAddress.getLocalHost();
Socket clientSocket = new Socket(host, 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

long startTime, endTime, tGap, totalTime = 0;
byte[] sendData = new byte[1024];
int numBytes, filesSent = 0;

while (filesSent < 100) {
    FileInputStream fin = new FileInputStream(fs);
    long thisFileLength = fileLength;

    System.out.println("Sending file to server...");
    startTime = System.currentTimeMillis();

    outToServer.writeLong(thisFileLength);

    while (thisFileLength > 0) {
        if (thisFileLength < sendData.length) {
            numBytes = fin.read(sendData, 0, (int) thisFileLength);
        } else {
            numBytes = fin.read(sendData, 0, sendData.length);
        }

        System.out.println(numBytes);
        if (numBytes < 1) {
            break;
        }

        outToServer.write(sendData, 0, numBytes);
        thisFileLength -= numBytes;
    }

    outToServer.flush();

    endTime = System.currentTimeMillis();
    tGap = endTime - startTime;
    totalTime = totalTime + tGap;
    System.out.println("Finished run " + filesSent + " with a time of " + tGap);
    filesSent++;

    fin.close();

    if (thisFileLength > 0) {
        break;
    }
}

clientSocket.close();

System.out.println("I am done to send " + filesSent + " times file, and the average time is: " + (double) totalTime / filesSent);

Server:服务器:

ServerSocket welcomeSocket = new ServerSocket(6789);
System.out.println("I am starting now....");

Socket connectionSocket;
connectionSocket = welcomeSocket.accept();
DataInputStream inFromClient = new DataInputStream(new BufferedInputStream(connectionSocket.getInputStream()));

long startTime, endTime, tGap, totalTime = 0;
byte[] receiveData = new byte[1024];
int numBytes, filesRecieved = 0;

while (filesRecieved < 100) {
    string filename = "receivedFile" + filesRecieved + ".txt";
    FileOutputStream outPut = new FileOutputStream(filename);

    startTime = System.currentTimeMillis();

    long fileLength = inFromClient.readLong();
    System.out.println("OG Bytes: " + fileLength);

    while (fileLength > 0) {
        if (fileLength < receiveData.length) {
            numBytes = inFromClient.read(receiveData, 0, (int) fileLength);
        }
        else {
            numBytes = inFromClient.read(receiveData, 0, receiveData.length);
        }

        if (numBytes < 1) {
            break;
        }

        try {
            outPut.write(receiveData, 0, numBytes);
            System.out.println(numBytes);
        }
        catch (Exception e) {
            break;
        }

        fileLength -= numBytes;
    }

    outPut.close();

    endTime = System.currentTimeMillis();
    tGap = endTime - startTime;
    totalTime = totalTime + tGap;
    System.out.println("I have received " + filename + " using time = " + tGap);
    filesRecieved++;

    if (fileLength > 0) {
        break;
    }
}

connectionSocket.close();

System.out.println("I am done now... and the average time used to receive each copy is: " + totalTime / filesRecieved);
welcomeSocket.close();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM