3

您好,提前感谢您花时间阅读。我正在尝试使用 TCP 开发一个简单的 Java 文件传输应用程序。到目前为止,使用我的客户端和服务器类,我已经设法为其添加了一个有效的上传方法(将文件上传到运行服务器的计算机)。

我对这方面还很缺乏经验,所以我走得很慢。我还需要添加一个下载选项(从服务器获取文件),列出服务器中的所有文件,以及一个允许我从服务器中删除任何文件的选项。

对于服务器和客户端,我都使用特定的默认文件夹(在本例中为 C:/Sharedfolder)。目前我的问题是:

  1. 在我当前的服务器代码中,上传到它的文件被重命名为“newfile”。我怎样才能将文件名更改为“oldfile_new”(作为 oldfile 实际原始文件的名称)?
  2. 使用下面我当前的服务器代码,我可以创建一个客户端类来从服务器下载一个可以使用它的文件吗?我该怎么做?上传部分对我来说很有意义,但我仍在尝试从服务器中找出下载/列出文件。
  3. 我目前正在使用预定义的主机 IP,但我最终需要修改应用程序,以便客户端发送 UDP 广播以在专用网络上查找服务器。谁能指出我如何做到这一点的任何方向?

我当前的服务器代码如下:

public class Server {

public static void main(String[] args) throws IOException {

    ServerSocket serverSocket = null;

    try {
        serverSocket = new ServerSocket(4555);
    } catch (IOException ex) {
        System.out.println("Can't setup server on this port number.\n");
    }

    Socket socket = null;
    InputStream is = null;
    OutputStream fos = null;
    BufferedOutputStream bos = null;
    int bufferSize = 0;
    System.out.println("Ready...");

    try {
        socket = serverSocket.accept();
    } catch (IOException ex) {
        System.out.println("Can't accept client connection.\n");
    }

    try {
        is = socket.getInputStream();

        bufferSize = socket.getReceiveBufferSize();
        System.out.println("Buffer size: " + bufferSize);
    } catch (IOException ex) {
        System.out.println("Can't get socket input stream.\n");
    }

    try {
        fos = new FileOutputStream("C:\\Sharedfolder\\newfile");
        bos = new BufferedOutputStream(fos);

    } catch (FileNotFoundException ex) {
        System.out.println("File not found.\n");
    }

    byte[] bytes = new byte[bufferSize];

    int count;

    while ((count = is.read(bytes)) > 0) {
        bos.write(bytes, 0, count);
    }

    bos.flush();
    bos.close();
    is.close();
    socket.close();
    serverSocket.close();

}

}

任何帮助将非常感激。谢谢 :)

4

2 回答 2

1

已经有很多工具可以做到这一点,但这是一个很好的学习练习。

通常,您不仅需要传输数据,还需要传输有关文件本身的一些信息:

  1. 将文件名从服务器发送到客户端
  2. 将文件的大小从服务器发送到客户端
  3. 将文件的数据发送给客户端。客户端可以使用 step 中收到的 size 来计算进度
  4. 将文件的修改时间从服务器发送到客户端。客户端用 mod 时间标记接收到的文件

所有这些东西都可以通过你实例化的流对象发送,你只需要确保客户端/服务器之间的事件顺序是正确的。

于 2013-10-15T08:59:10.463 回答
1

我曾经使用java构建一个使用加密,证书的客户端-服务器安全文件传输通道。所以,也许我可以给你一些帮助。

问题1:为了从客户端获取文件名,您必须在传输文件数据之前将文件名传输到服务器。

问题2:为了从服务器下载文件,你必须给你的服务器一个信号(文件下载/上传请求)告诉它是下载还是上传操作,看起来很像ftp协议。这样的信号应该被预先传输到服务器端。因此,您必须打开与服务器端相同的套接字,用于从服务器获取文件的输入流。

public static boolean send(FileInputStream fis,OutputStream os) throws IOException, InterruptedException
{
    Thread.currentThread().sleep(1000);
     while(true)
        {
            int read=0;
        if(fis!=null)
            read=fis.read(buf);
        byte[] result=new byte[read];
        //System.out.println(read);
        // os.write(buf,0,read);

         System.arraycopy(buf, 0, result,0, read);
            os.write(result);
            if(read < BUFFER_SIZE)
            {
                //System.out.println("服务器向客户端发送read="+read);
            break;
            }
        }//while
    fis.close();    
    return true;
}

在函数中,fis 是要发送的文件流。os 是从套接字获取的输出流,例如:

s = new ServerSocket(6868);
socket= s.accept();
os=socket.getOutputStream();

问题3:你应该设置IP地址,端口号和协议类型(TCP / UDP)作为你的主函数的参数。所以,你可以设置你的参数,而不是修改你的源代码,让你的应用程序在不同的环境中运行方向如你所愿。

这就是我所知道的。希望它能给你一些帮助。

于 2013-10-15T12:53:51.657 回答