如何与文件一起发送文件信息?

时间:2013-07-03 09:43:06

标签: java sockets

我正在编写服务器和客户端文件传输模块,我想知道是否可以将文件信息与文件本身一起发送。特别是我需要将文件名和文件夹结构发送到客户端的服务器上。 防爆。如果我在服务器上有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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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();
  }

答案 3 :(得分:0)

邮编
1。档案
2。有关文件的信息
发送)