Передача файлов сокета сервера - PullRequest
3 голосов
/ 08 октября 2011

Я использовал концепцию сокета сервера в Java для передачи файлов, таких как изображения и видео. Но когда я получаю на стороне клиента, я настраиваю имена файлов. Могу ли я получить оригинальное имя файла, как оно есть?

Например:

Если файл со стороны сервера для передачи - "abc.txt", мне нужно, чтобы это имя было отражено на стороне клиента (без передачи имени отдельно).

В конце сервера:

public class FileServer {
  public static void main (String [] args ) throws Exception {
    // create socket
    ServerSocket servsock = new ServerSocket(13267);
    while (true) {
      System.out.println("Waiting...");

      Socket sock = servsock.accept();
      System.out.println("Accepted connection : " + sock);
      OutputStream os = sock.getOutputStream();
    new FileServer().send(os);
      sock.close();
      }
    }

  public void send(OutputStream os) throws Exception{
      // sendfile
      File myFile = new File ("C:\\User\\Documents\\abc.png");
      byte [] mybytearray  = new byte [(int)myFile.length()+1];
      FileInputStream fis = new FileInputStream(myFile);
      BufferedInputStream bis = new BufferedInputStream(fis);
      bis.read(mybytearray,0,mybytearray.length);
      System.out.println("Sending...");
      os.write(mybytearray,0,mybytearray.length);
      os.flush();
  }
}

На стороне клиента:

    public class FileClient{
  public static void main (String [] args ) throws Exception {


    long start = System.currentTimeMillis();


    // localhost for testing
    Socket sock = new Socket("127.0.0.1",13267);
    System.out.println("Connecting...");
    InputStream is = sock.getInputStream();
    // receive file
    new FileClient().receiveFile(is);
       long end = System.currentTimeMillis();
    System.out.println(end-start);

    sock.close();
  }

  public void receiveFile(InputStream is) throws Exception{
      int filesize=6022386;
      int bytesRead;
      int current = 0;
      byte [] mybytearray  = new byte [filesize];

        FileOutputStream fos = new FileOutputStream("def");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bytesRead = is.read(mybytearray,0,mybytearray.length);
        current = bytesRead;


        do {
           bytesRead =
              is.read(mybytearray, current, (mybytearray.length-current));
           if(bytesRead >= 0) current += bytesRead;
        } while(bytesRead > -1);

        bos.write(mybytearray, 0 , current);
        bos.flush();
        bos.close();
  }
}

Ответы [ 4 ]

4 голосов
/ 08 октября 2011

Чтобы получатель знал имя файла, либо:

а) он должен предполагать, что знает имя, потому что он спросил его,

b) сервер сначала отправляет имя как часть потока.

Если вы придумали способ отправки информации без фактической отправки, дайте мне знать, и мы можем стать миллиардерами. Мы можем назвать это «компьютерной телепатией».

2 голосов
/ 08 октября 2011

Да, просто передайте метаданные (в вашем случае myFile.getName()) перед фактическим содержимым файла, и заставьте клиента и сервер читать и выдавать эти метаданные.Рекомендуется использовать установленные протоколы, например HTTP и его заголовок Content-Disposition.

1 голос
/ 26 июня 2013

Есть более простой способ сделать это.Просто оберните ваш входной поток внутри DataInputStream и используйте такие методы, как .writeUTF (myFile.getName ()).Точно так же вы можете прочитать имя файла в получателе, применив .readUTF к DataInputStream.Вот пример кода: Отправитель:

FileInputStream fis = new FileInputStream(myFile);  
    BufferedInputStream bis = new BufferedInputStream(fis);
    DataInputStream dis = new DataInputStream(bis);
    OutputStream os;
    try {
        os = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeUTF(myFile.getName());  
.............////// catch exceptions

Получатель:

InputStream in;
    try {
        bufferSize=socket.getReceiveBufferSize();
        in=socket.getInputStream();
        DataInputStream clientData = new DataInputStream(in);
        String fileName = clientData.readUTF();
        System.out.println(fileName);
................../////// catch exceptions
1 голос
/ 08 октября 2011
...