0

네트워크를 통해 지정된 디렉토리에 이미지 파일을 보낼 기본 클라이언트 서버를 만들었습니다. 이 코드는 지난 주에 작동했지만 오늘 다시 돌아 왔으며 클라이언트가 디렉토리에있는 모든 이미지 파일을 보냈음에도 불구하고 서버 측에서 하나의 파일 만 가져 오는 것으로 보입니다. 그것은 클라이언트 코드에서 뭔가있을 수 있지만 그것은 서버 쪽에서 뭔가라고 생각합니다. 도움을 주시면 대단히 감사 드리며보다 효율적인 솔루션을 보유하고 계시다면 필자는 필요에 따라 코드를 변경해 드리겠습니다. 내 코드는 다음과 같습니다 :객체 입력 스트림은 네트워크를 통해 하나의 파일 만 가져오고 있습니까?

ImageServer와

 package com.encima.network.server; 

     import java.io.*; 
     import java.net.*; 

     public class ImageServer{ 

    ServerSocket ss; 
    Socket s; 
    ObjectOutputStream oos; 
    int port = 4440; 

    public ImageServer() throws IOException { 
     try { 
     ss = new ServerSocket(port); 
     System.out.println("Server started on Port: " + port); 
     } catch(IOException e) { 
     System.out.println("Serevr: Port-" + port + " not available, exiting."); 
     System.exit(0); 
     } 

     System.out.println("Server: Waiting for Client Connection..."); 

     while(true) { 
     try { 
     s = ss.accept(); 
     new ImageHandler(s); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     ImageServer is = new ImageServer(); 
    } 

     } 

ImageHandler 

    package com.encima.network.server; 

    import java.awt.image.BufferedImage; 
    import java.io.FileOutputStream; 
    import java.io.ObjectInputStream; 
    import java.net.Socket; 

    import javax.imageio.ImageIO; 

    public class ImageHandler implements Runnable { 

    Socket s; 
    int count = 0; 

    public ImageHandler(Socket socket) { 
     s = socket; 
     Thread t = new Thread(this); 
     t.start(); 
    } 

    @Override 
    public void run() { 

     try { 
     ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); 
     FileOutputStream fos = new FileOutputStream("image" + System.nanoTime() + ".jpg"); 
     count++; 
     //BufferedImage in = ImageIO.read(ois); 
     //ImageIO.write(in, "jpg", fos); 

     int ch = 0; 
     while(true) { 
     ch = ois.read(); 
      if(ch == -1) { 
      break; 
      } 
     fos.write(ch); 
     } 
     fos.flush(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    } 



Finally, the ImageClient 

    package com.encima.network.client; 

    import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    import java.io.ObjectOutputStream; 
    import java.net.Socket; 

    import javax.imageio.ImageIO; 

    import com.encima.network.ImageFilter; 


    public class ImageClient { 

    Socket s; 
    String ip = "localhost"; 
    int port = 4440; 
    ObjectOutputStream oos; 

    public ImageClient(File[] files) throws IOException, ClassNotFoundException, InterruptedException { 

     try { 
     s = new Socket(ip, port); 
     System.out.println("Client connected to Server via " + ip + " on port 80"); 
     } catch (Exception e) { 
     System.out.println("Client: Cannot find Host: " + ip + ". Exiting."); 
     System.exit(0); 
     } 

     oos = new ObjectOutputStream(s.getOutputStream()); 

     for(File f: files) { 
     sendFile(f); 
     } 
     oos.close(); 
     //System.out.println("Written Image " + i + " of " + files.length); 
    } 

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 
     File dir = new File("/Users/christophergwilliams/Dropbox/PhD/Projects/PhD/Year 1/GSN/images"); 
     File[] files = dir.listFiles(new ImageFilter()); 
     ImageClient ic = new ImageClient(files); 
    } 

    public void sendFile(File file) throws IOException { 
     FileInputStream fis = new FileInputStream(file); 
     //BufferedImage b = ImageIO.read(file); 
     //ImageIO.write(b, "jpg", oos); 
     int ch = 0; 
     while(true) { 
     ch = fis.read(); 
     if(ch == -1) { 
     break; 
     } 
     oos.write(ch); 
     } 
     oos.flush(); 
     System.out.println("Image Sent"); 

    } 


} 

나는 그것을 통해 읽을 수있는 코드의 많은 것을 알고하지만 난 이것에 얻을 수있는 모든 도움을 주셔서 감사 해!

효율성 및 네트워크 트래픽을 위해 이미지를 클라이언트에서 서버로 보내는 것이 좋을까요?

답변

3

ObjectInputStream을 사용하고 있습니까? 직렬화 된 객체는 원시 이진 데이터 만 읽거나 쓰지 않습니다. 제공된 InputStream을 사용하고 그 내용을 읽으십시오.

어쨌든 큰 문제는 아닙니다. 큰 문제는 하나의 파일이 하나의 스트림에 여러 파일을 쓰는 것입니다. 하나의 파일이 끝내야 할 위치와 다음 파일이 시작될 위치가 표시되지 않습니다. 어떻게 여러 파일을 분할 할 것으로 예상 했습니까? 옵션 :

  • 파일 사이의 구분 기호 사용 -
  • 각 보내기 길이와
  • 접두사 각 파일 (아주 추악한 잠재적으로 당신을 따라 갔다으로 구분 기호처럼 보였다 데이터를 탈출 당신은 할 것)

다른 연결 파일 (당신은 또한 읽고 한 번에 하나의 바이트를 쓰고있어. 읽기의 오버로드를 사용하여/바이트 배열을 수용하는 물품.)

+1

을 그래서, 당신은 같은 것을 사용하는 것이 좋습니다 것입니다 BufferedOutputStream 대신에? –

+0

다른 연결에서 파일을 보내는 것에 관해서는 각 파일에 대해 새로운 출력 (및 입력) 스트림을 만드는 것만으로도 될까요? –

+0

@Christopher : 매번 다른 소켓을 사용하여 연결해야합니다. 'BufferedOutputStream'이 필요한지에 관해서는 ... 개인적으로 당신이 필요하다고 느낄 때까지 명시적인 버퍼링을 추가하지 않아도됩니다. 내 요점은'Object * Stream'을 없애는 것이 었습니다. 당신에게 아무런 효과가 없으며 실제로 객체를 쓰고 있다는 가독성을 해치고 있습니다. –