2013-10-20 3 views
0

다중 스레드 서버 소켓을 만들려고했습니다. 사용 가능한 파일 또는 파일의 문자열을 스트림으로 보낼 수 있습니다. 문제는 요청 된 파일을 스트림으로 보내고, 한 번 작동하는 else 블록입니다. 내 코드의 문제는 어디에 있으며 왜 단 한번 응답합니까? 클래스 위Java 다중 스레드 서버 소켓

public class ServerThread extends Thread { 

Socket socket = null; 

public ServerThread(Socket socket) { 
    this.socket = socket; 
} 


public void run() { 
    try { 
     String message = null; 
     PrintStream ps = null; 
     String string = null; 
     File file = null; 


     BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     ps = new PrintStream(socket.getOutputStream()); 

     while ((message = bufferedreader.readLine()) != null) { 

      if (message.equals("list")) { 
       ps.println(Arrays.toString(getServerFiles())); 

      } else { 
       message = "FilesServer\\" + message; 
       file = new File(message); 

       //JOptionPane.showConfirmDialog(null, message); 
       if (file.exists()) { 
        BufferedInputStream bfInStream = 
          new BufferedInputStream(new FileInputStream(message)); 
        BufferedOutputStream bufOutStream = 
          new BufferedOutputStream(socket.getOutputStream()); 

        byte[] buffer = new byte[1024]; 
        int read = 0; 

        while ((read = bfInStream.read(buffer)) != -1) { 
         bufOutStream.write(buffer, 0, read); 
         bufOutStream.flush(); 
        } 
        bufOutStream.close(); 
        System.out.println("File transfered"); 
       } 
      } 
     } 
    } catch (Exception e) { 
     //JOptionPane.showConfirmDialog(null, e.getMessage()); 
    } 
} 

private static String[] getServerFiles() { 
    String result[]; 
    File folder = new File("FilesServer\\"); 
    File[] listOfFiles = folder.listFiles(); 



    result = new String[listOfFiles.length]; 
    for (int i = 0; i < listOfFiles.length; i++) { 
     if (listOfFiles[i].isFile()) { 
      result[i] = listOfFiles[i].getName(); 
     } 
    } 
    return result; 
} 

}

이 클래스에서 호출 : 서버 응용 프로그램에 대한

public class Server { 

private int defaultPort = 8088; 

public static void main(String[] args) throws IOException { 
    new Server().InitServer(); 
} 


private void InitServer() throws IOException{ 
    ServerSocket serversocket = new ServerSocket(8081); 

    while(true){ 
     Socket socket = serversocket.accept(); 
     new ServerThread(socket).start(); 
    } 
} 

}

+2

'bufOutStream.close'를 호출하면 기본 소켓도 닫습니다. – MadProgrammer

답변

0

, 당신은 ServerSocket를 사용해야합니다. ServerSocket은 새 클라이언트가 accept() 메소드를 통해 파일을 요청할 때마다 새로운 소켓을 만들어야합니다. 그런 다음 새로 만든 소켓에 바이트를 보내고 안전하게 닫을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 이미 다른 클래스에서 시작되었습니다. – Meisam

+0

네, 업데이트가 보입니다. –

0

BufferedOutputStream bufOutStream을 열거 나 닫지 마십시오. 대신 ps에 직접 쓰고 while 루프 이후를 닫으십시오.

닫기 bufOutStream은 MadProgrammer가 이미 언급 한 것처럼 소켓을 닫습니다.

+0

안내에 따라 코드가 변경되었지만 여전히 작동하지 않습니다. – Meisam

+0

내 코드는 다음과 같습니다. [link] (https://docs.google.com/file/d/0B9RLwsPgO8cbQzR1WTQ5SXcyTnM/edit?usp=sharing) – Meisam

+0

ServerThread와 간단한 테스트를 작성했습니다. 이 테스트는 코드 변경없이 수행되었습니다. "관련 없음"은 FileInputStream (message) 대신 ByteArrayInputStream (message.getBytes())에서 somes 바이트를 반환했다는 것입니다. 이제는 내 물건에 다른 문제가있을 수 있습니다. 하지만 여기에 귀하의 질문에 관련되지 않습니다. – cybye