2017-12-03 5 views
0

사용자가 파일을 업로드하고 다운로드 할 수있는 간단한 서버 클라이언트 프로그램을 만들려고합니다. 소켓 및 스트림 작동하도록 및 파일을 서버에 업로드 할 수 있습니다. 그러나 하나의 파일이 업로드 될 때마다 서버 측은 스트림을 읽고이를 서버 파일로 전달하는 루프에 걸린 것처럼 보입니다.Java에서 소켓을 통한 파일 전송이 while 루프를 벗어나지 않습니다.

서버 코드 :

InputStream in = clientSocket.getInputStream(); 

    String filePath = "......." 
      + op[1]; 

    System.out.println(op[0] + ": " + filePath); 

    FileOutputStream out = new FileOutputStream(filePath); 

    byte[] bytes = new byte[16*1024]; 

    int count; 

    while ((count = in.read(bytes)) > 0) { 
     out.write(bytes, 0, count); 
    } 

클라이언트 코드 :

String filePath = "...." 
      + path; 
    System.out.println("Attempting: " + filePath); 

    dos = new DataOutputStream(serverSocket.getOutputStream()); 
    fis = new FileInputStream(filePath); 

    byte[] buffer = new byte[4096]; 

    while (fis.read(buffer) > 0) { 
     dos.write(buffer); 
    } 

    dos.flush(); 
    fis.close(); 

문제는 프로그램이 잠시 루프에 걸리면, 그래서 서버 다른 작업을 수행 할 수 있다는 것입니다. 오류 또는 기타 오류가 없습니다 ...

답변

0

클라이언트 측에서 스트림을 닫지 마십시오. dos.flush() 다음에 dos.close()을 추가하십시오!

+0

감사합니다. 프로그램에서 while 루프를 종료했습니다. 그러나 클라이언트와 서버 간의 소켓 연결도 닫힙니다. 3 개의 파일을 연속으로 업로드 할 수있는 프로그램을 갖고 싶습니다. 각 업로드 후에 소켓을 닫으면 다시 연결해야합니다. 이 문제를 해결할 방법이 있습니까? 아니면 각 요청에 대해 서버에 연결해야합니까? –

+0

서버가 파일 경계를 인식 할 수 있도록하는 프로토콜을 정의하고자 할 수 있습니다. 예를 들어, 각 파일 앞에 파일 크기를 보내도록 스트림을 설정할 수 있습니다. 서버 읽기 루프는 이것을 고려해야합니다. "off the shelf"Java 구현을 사용하는 다양한 파일 전송 프로토콜이 존재하기 때문에이 학습을 수행한다고 가정합니다. –