将字符串和文件发送到InputStream

时间:2017-12-01 00:22:14

标签: java inputstream serversocket

我试图将文件名然后文件本身发送到服务器。正在接收字符串并用于由服务器创建文件。但是,服务器实际上没有任何数据写入文件。

在我将Writer&(文件名是硬编码的)添加到服务器和客户端之前,我已将文件传输工作,但现在我无法同时使用它们

客户端:

{{1}}

服务器:

{{1}}

2 个答案:

答案 0 :(得分:0)

您还需要关闭File Ouptut Stream。与

bos.close;

添加

fos.close;

答案 1 :(得分:0)

这是我的解决方案,这种方法需要一些改进:

<强>解释

  • 位置0:文件名长度
  • 在位置1到文件名的长度:filename as bytes。
  • 位置1 +文件名长度直到长度:文件内容。

基本上,我会立即将所有信息发送到服务器(这是您需要弄清楚的一项改进)

另一个改进是通过块发送文件,而不是一次发送所有文件。

客户类:

public class Client {

public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(System.in);
    while (true) {
        String fileName = sc.nextLine();
        System.out.println(fileName);
        try {
            File file = new File(fileName);

            byte[] mybytearray = new byte[1 + fileName.getBytes().length + (int) file.length()];
            mybytearray[0] = (byte) fileName.length();

            System.arraycopy(fileName.getBytes(), 0, mybytearray, 1, fileName.getBytes().length);

            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            bis.read(mybytearray, fileName.getBytes().length + 1, (int) file.length());

            Socket socket = new Socket("localhost", 15000);
            OutputStream os = socket.getOutputStream();

            os.write(mybytearray, 0, mybytearray.length);

            os.flush();
            os.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
}

服务器类:

public class Server extends Thread {

public static final int PORT = 15000;

public static void main(String[] args) {
    new Server().start();
}

@Override
public void run() {
    try {
        ServerSocket serverSocket = new ServerSocket(PORT);
        while (true) {
            Socket sock = serverSocket.accept();
            readFile(sock);
        }
    } catch (Exception e) {
    }
}

private void readFile(Socket socket) throws Exception {
    InputStream ois = socket.getInputStream();

    byte[] resultBuff = new byte[0];
    byte[] buff = new byte[1024];
    int k;
    while ((k = ois.read(buff, 0, buff.length)) > -1) {
        byte[] tbuff = new byte[resultBuff.length + k];
        System.arraycopy(resultBuff, 0, tbuff, 0, resultBuff.length);
        System.arraycopy(buff, 0, tbuff, resultBuff.length, k);
        resultBuff = tbuff;
    }

    byte lengthOfFileName = resultBuff[0];

    byte fileNameBytes[] = new byte[lengthOfFileName];
    System.arraycopy(resultBuff, 1, fileNameBytes, 0, lengthOfFileName);
    String filename = new String(fileNameBytes);

    FileOutputStream fos = new FileOutputStream(filename + System.currentTimeMillis());

    byte[] bytearr = new byte[resultBuff.length - (lengthOfFileName + 1)];
    System.out.println("Writing file...");

    System.arraycopy(resultBuff, lengthOfFileName + 1, bytearr, 0, bytearr.length);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    bos.write(bytearr);

    bos.close();
    System.out.println("Writing file complete...");
}
}

希望这有帮助!

快乐的编码时间!