0

我正在编写一个服务器和客户端文件传输模块,我想知道是否可以将文件信息与文件本身一起发送。特别是我需要发送到客户端的服务器上文件的文件名和文件夹结构。前任。如果我在服务器上有 c:\abc\efg\a.txt 我想在客户端上有 .\abc\efg\a.txt 。

这是我正在使用的代码:

服务器端文件发送:

    Socket clientSocket=new Socket("Some IP",12345);

    OutputStream out=clientSocket.getOutputStream();

    FileInputStream fis=new FileInputStream(file);
    int x=0;
    byte[] b = new byte[4194304];
    while(true){
        x=fis.read(b);
        if(x==-1)break;
        out.write(b);
   }
    out.close();

客户端监听器:

try {
        ServerSocket ss=new ServerSocket(12345);
        while(true){
            final Socket client = ss.accept();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        InputStream in = client.getInputStream();
                        FileOutputStream fos = new FileOutputStream("rec.txt");
                        int x=0;
                        byte[] b = new byte[4194304];
                        while(true){
                            x=in.read(b);
                            if(x==-1)break;
                            fos.write(b);
                        }
                        fos.close();
                    }
                    catch(Exception e){
                    }
                }
            }).start();
        }

    } catch (Exception e) {
    }
4

4 回答 4

1

首先发送包含您需要的所有信息的标题,然后是分隔符(例如 0),然后是文件内容。服务器端读取标题直到分隔符然后是内容。

于 2013-07-03T09:57:44.780 回答
1

我以前做过。我在服务器上使用 DataOutputStream,在客户端使用 DataInputStream。

我使用了这个协议:
1. 发送文件名 .writeUTF(fileName);
2.发送文件大小.writeLong(fileSize);
3. 发送文件 .writeBytes(byteArray); // 这是在 for 循环中完成的,因为文件可能太大而无法立即放入内存。服务器和客户端大小都将使用 fileSize 来确定何时停止。

客户端将使用相同的协议,但不是“写”,而是“读”。

于 2013-07-03T10:09:14.913 回答
1

您需要先发送文件路径,然后是文件名,使用 64 字节缓冲区来执行此操作,一旦获得路径和名称,您就可以读取文件内容。

例如:

   // Server
   try
   {
       Socket clientSocket=new Socket("Some IP",12345);
       OutputStream out=clientSocket.getOutputStream();
       FileInputStream fis=new FileInputStream(file);
       byte[] info = new byte[64];
       int len = file.getPath().length();
       info = file.getPath().getBytes();
       for (int i=len; i < 64; i++) info[i]=0x00;
       out.write(info, 0, 64);
       len = file.getName().length();
       info = file.getName().getBytes();
       for (int i=len; i < 64; i++) info[i]=0x00;
       out.write(info, 0, 64);

       int x;
       byte[] b = new byte[4194304];
       while((x=fis.read(b)) > 0)
       {
         out.write(b, 0, x);
       }
      out.close();
      fis.close();
  }
  catch (Exception e)
  {
      e.printStackTrace();
  }

  // Client
  try
  {
      InputStream in = client.getInputStream();
      FileOutputStream fos = new FileOutputStream("rec.txt");
      byte[] path = new byte[64];
      in.read(path, 0, 64);
      byte[] name = new byte[64];
      in.read(name, 0, 64);

      int x=0;
      byte[] b = new byte[4194304];
      while((x = in.read(b)) > 0)
      {
          fos.write(b, 0, x);
      }
      fos.close();
  }
  catch(Exception e)
  {
     e.printStackTrace();
  }
于 2013-07-03T10:16:10.697 回答
0

Zip
1.文件
2.文件信息
发送)

于 2013-11-12T17:06:57.833 回答