服务器和客户端之间的文件上传和下载

4

我有一个任务,需要创建一个客户端-服务器文件传输应用程序。

这是一个简单的例子。我尝试了在SO中类似问题中给出的示例,但它们无法传输文件。

我正在尝试通过套接字来通信客户端和服务器。如果有人能帮助我,我会很高兴。

客户端将上传文件到服务器。同时,客户端可以从服务器下载文件。这就是我将创建应用程序的方式。

以下是客户端代码:

package wdc;

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

class TCPClient {

    public static void main(String args[]) {
        byte[] aByte = new byte[1];
        int bytesRead;

        Socket clientSocket = null;
        InputStream is = null;

        try {
            clientSocket = new Socket("127.0.0.1", 3248);
            is = clientSocket.getInputStream();
        } catch (IOException ex) {
            // Do exception handling
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        if (is != null) {

            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
            try {
                fos = new FileOutputStream("C:\\testout.pdf");
                bos = new BufferedOutputStream(fos);
                bytesRead = is.read(aByte, 0, aByte.length);

                do {
                        baos.write(aByte);
                        bytesRead = is.read(aByte);
                } while (bytesRead != -1);

                bos.write(baos.toByteArray());
                bos.flush();
                bos.close();
                clientSocket.close();
            } catch (IOException ex) {
                // Do exception handling
            }
        }
    }
}

以下是服务器端代码:

package wds;

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

class TCPServer {

    public static void main(String args[]) {

        while (true) {
            ServerSocket welcomeSocket = null;
            Socket connectionSocket = null;
            BufferedOutputStream outToClient = null;

            try {
                welcomeSocket = new ServerSocket(3248);
                connectionSocket = welcomeSocket.accept();
                outToClient = new BufferedOutputStream(connectionSocket.getOutputStream());
            } catch (IOException ex) {
                // Do exception handling
            }

            if (outToClient != null) {
                File myFile = new File("C:\\testserver.pdf");
                byte[] mybytearray = new byte[(int) myFile.length()];

                FileInputStream fis = null;

                try {
                    fis = new FileInputStream(myFile);
                } catch (FileNotFoundException ex) {
                    // Do exception handling
                }
                BufferedInputStream bis = new BufferedInputStream(fis);

                try {
                    bis.read(mybytearray, 0, mybytearray.length);
                    outToClient.write(mybytearray, 0, mybytearray.length);
                    outToClient.flush();
                    outToClient.close();
                    connectionSocket.close();

                    // File sent, exit the main method
                    return;
                } catch (IOException ex) {
                    // Do exception handling
                }
            }
        }
    }
}

我无法运行这些源文件,也不知道原因。

1
你遇到了什么具体的问题?这里的问题是什么? - Oliver Charlesworth
请详细说明“我无法运行这些源文件”的情况。您是如何尝试的?实际发生了什么事情? - BalusC
我已经构建了这个项目。没有错误。我将每个项目都指定为一个,服务器端:wds,客户端:wdc。 在NetBeans中构建项目时,我将类设置为每个项目的主类。然后我尝试运行它们,但文件传输没有发生。我需要在我的电脑上设置一个服务器吗?我知道我不必这样做。这段代码是否存在错误,使其无法从客户端下载文件到服务器?或者我还有其他错误吗? - el nino
我怎样给客户端添加上传方法?另外,我应该如何编辑服务器代码才能接收文件?感谢您的帮助。 - el nino
代码看起来很好,也许你应该考虑一下“包”这部分。 - Zuko
1个回答

4
我查看了代码,乍一看似乎没有问题。因此,我按原样复制了它,将服务器代码中使用的文件更改为存在于我的系统上的文件并运行了代码。它完全正常工作,所以至少我可以向您保证代码是正确的,并且它执行了它应该执行的操作。 我在Ubuntu机器上运行了我的代码,但我不确定这会如何影响结果。
以下是一些可能有用的指针: 1)您是否先运行TCPServer文件,然后再运行TCPClient?(很蠢,我知道,但你永远不知道) 2)是否有进程正在使用端口3248? 3)运行文件的进程是否具有读/写指定路径的权限? 4)在TCPServer中指定的文件是否实际存在? 5)您是否尝试在IDE之外运行类文件 - 无论如何,学习如何独立于IDE都是好的。
希望这对您有所帮助,祝您完成作业顺利。

谢谢你的回答。是的,我先运行了服务器。通过更改文件路径,在命令提示符下它可以工作。独立于IDE很重要。谢谢。 :) - el nino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接