【问题标题】:Java file transfer file to serverJava文件传输文件到服务器
【发布时间】:2015-11-21 23:37:52
【问题描述】:

我是 Java 网络的新手,并且已经为我的问题寻找了一段时间的解决方案,我想为什么不就这个问题向一些更有资格的人寻求一些建议呢?

我目前制作了一个管理我的服务器的小工具和另一个小客户端工具。我的目标是让该工具能够将命令从客户端发送到服务器计算机。这样我就可以从另一台机器上在服务器计算机上执行某些操作,包括发送包含更新文件的 zip 存档。

我已经完成了基本设置:从客户端向服务器发送命令(服务器回复确认)的 TCP 连接,然后我希望执行假定的操作。我现在的问题是:

从客户端向服务器发送文件 (.zip) 时,我应该通过 TCP 发送它还是使用 FTP 之类的东西?我不仅想将文件发送到服务器,还想在它到达时提取并替换现有文件。

亲切的问候,亚历克斯

编辑:这是我用于将文件从客户端传输到服务器的方法,但是文件没有以完整大小到达目的地.. D:

服务器

package server.control.net.impl;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Update implements Runnable {

    private final static int serverPort = 5555;
    private final static String fileInput = "C:\\Users\\Alexander\\Documents\\update.zip";

    public static void main(String args[]) throws IOException{
        ServerSocket servsock = new ServerSocket(serverPort);
        File myFile = new File(fileInput);
        while (true) {
          Socket sock = servsock.accept();
          byte[] mybytearray = new byte[(int) myFile.length()];
          BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
          bis.read(mybytearray, 0, mybytearray.length);
          OutputStream os = sock.getOutputStream();
          os.write(mybytearray, 0, mybytearray.length);
          os.flush();
          sock.close();
        }
    }

    public static void start(){
        Update upd = new Update();  
        Thread tupd = new Thread(upd);  
        tupd.start(); 
    }

    @Override
    public void run() {

    }
}

客户

package server.control.net;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {

    private final static String serverIP = "127.0.0.1";
    private final static int serverPort = 5555;
    private final static String fileOutput = "C:\\Users\\Alexander\\Documents\\updateoutput.zip";

    public static void main(String args[]) throws UnknownHostException, IOException {
        Socket sock = new Socket(serverIP, serverPort);
        byte[] mybytearray = new byte[1024];
        InputStream is = sock.getInputStream();
        FileOutputStream fos = new FileOutputStream(fileOutput);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int bytesRead = is.read(mybytearray, 0, mybytearray.length);
        bos.write(mybytearray, 0, bytesRead);
        bos.close();
        sock.close();
    }
}

【问题讨论】:

  • 因为你已经有一个 TCP,我会使用它。 FTP 必须在特权端口上运行,这使得运行您自己的端口更加复杂。
  • 感谢您的快速回复。我用我的 tcp 文件传输代码更新了主帖子,但是文件没有完全到达服务器
  • 您的客户端应该循环读取直到read 返回-1。否则,您最多读取1024 字节,因为这是您的数组的大小,但对于网络流,它甚至可能读取更少read 的单个调用,因为该方法不一定等到您的缓冲区数组已满。顺便说一句,您在服务器中使用 BufferedInputStream 已过时。通过使用与文件大小相同的数组,您已经拥有足够的缓冲区。
  • 您没有从服务器中的 Socket 获取 InputStream。

标签: java tcp file-transfer


【解决方案1】:

在serverSocket.accept() 之后,您没有从套接字中获得InputStream。在套接字上打开InputStream。

    clientSocket = serverSocket.accept();

    InputStream in = clientSocket.getInputStream();

    // Writing the file to disk
    // Instantiating a new output stream object
    OutputStream output = new FileOutputStream("YourFile.zip");

    byte[] buffer = new byte[1024];
    while ((bytesRead = in.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
    }
    // Closing the FileOutputStream handle
    output.close();

参考工作示例:Write and Read File over Socket

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2011-02-04
    • 2017-01-21
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多