2011-05-11 3 views
0

현재 클라이언트 - 서버 응용 프로그램을 디자인하려고합니다. 사용자가 서버에 연결하고 인증이 OK이면 서버가 사용자에게 일부 파일을 보냅니다. 문제는 그 파일들이 하나의 파일로 작성된다는 것입니다.클라이언트 - 서버 응용 프로그램 파일 전송

해야 할 파일을 선택 파일

public void processFile(int id, DataOutputStream oStream, Socket socket, int tip){ 
     String fileName; 
     if(tip==0){ 
      fileName="File"+Integer.toString(Intrebari[id])+".txt"; 
     }else{ 
      fileName="Image"+Integer.toString(Intrebari[id])+".jpg"; 
     } 
     byte[] buffer=null; 
     int bytesRead = 0; 
     FileInputStream file=null; 

     try { 
      file = new FileInputStream(fileName); 
      buffer = new byte[socket.getSendBufferSize()]; 
      while((bytesRead = file.read(buffer))>0) 
       { 
       oStream.write(buffer,0,bytesRead); 
       } 
      file.close(); 
     } catch (IOException ex) { 
      System.out.println(ex); 
     } 

    } 

그리고 기능을 전송 기능 보내

private void send(int id) throws IOException { 
     os.writeBytes("sendFile" + id+"\n"); 

     System.out.println("sendFile" + id); 
     generatedFiles.processFile(id, os, comunicare, 0); 
     if (generatedFiles.Imagini[id] == 1) { 
      os.writeBytes("sendImage" + id+"\n"); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(clientThread.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      System.out.println("sendImage" + id); 
      generatedFiles.processFile(id, os, comunicare, 1); 
     } 
    } 

내가 os을 언급 할 필요가 : 여기

몇 가지 코드 DataOutputStream이고 comunicareSocket 유형입니다.

writeByteswrite을 결합하는 것이 문제라고 생각합니다. 누구든지이 문제를 도와 줄 수 있습니까? 서버와 클라이언트가 파일과 메시지를 모두 수신하도록하려면 어떻게합니까? 서버 클라이언트 -confirms 파일 sucessfull 클라이언트가 파일 sucessfull 을 -confirms 파일 보내기 - 서버 명령 보내기 -

서버 파일 보내기 - 명령 보내기 -

서버 :

+0

그래서 기본적으로 FTP를 개혁하고 : 당신을 도울 수있는 몇 가지 기능 당신은 그냥 파일이나 이미지 여기

가 있는지 확인하기 위해 클라이언트 측에서 메시지를 읽을 필요가 있습니다. 왜? 이 숙제가 있니? –

+0

예, 그렇습니다. 나는 객관식 응용 프로그램을해야하므로 사용자 이름과 암호를 입력 한 다음 텍스트 파일에 저장되어있는 서버에서 질문을 다운로드하는 GUI를 사용해야합니다. –

답변

1

나는 이런 일을한다. .. 이런

... 당신이 클라이언트에서 소켓을 가지고 supose ... 당신보다

socket.getOutputStream.write ("FILE : SomeFile.bin, SIZE : 872973493 \ r \ n".getBytes ("인코딩 선택")) socket.getOutputStream.flush(); (서버 문자열 응답을 기대하는 경우에만 플러시 할 필요가 있습니다 : OK, 나에게 파일 보내기, IM 준비, 그렇지 않으면 필요 없음) 클라이언트가 파일을 읽고이 바이트 크기를 가지기 때문에 시작합니다. 예상대로 파일의 길이를 얻을 때까지 socket.getInputStream에서 읽습니다. 이 클라이언트가 파일을 확인한 후에

서버가 다른 파일을 보내면 FILE 대신 IMAGE : 또는 원하는 것을 사용할 수 있습니다.

public static void readInputStreamToFile(InputStream is, FileOutputStream fout, 
     long size, int bufferSize) throws Exception 
{ 
    byte[] buffer = new byte[bufferSize]; 
    long curRead = 0; 
    long totalRead = 0; 
    long sizeToRead = size; 
    while(totalRead < sizeToRead) 
    { 
     if(totalRead + buffer.length <= sizeToRead) 
     { 
      curRead = is.read(buffer); 
     } 
     else 
     { 
      curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead)); 
     } 
     totalRead = totalRead + curRead; 
     fout.write(buffer, 0, (int) curRead); 
    } 
} 


public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception 
{ 
    byte[] buffer = new byte[bufferSize]; 
    int count = 0; 
    while((count = in.read(buffer)) != -1) 
    { 
     out.write(buffer, 0, count); 
    } 
} 
+0

대단히 감사합니다. 내가 성공하면 나중에 시도해 보겠다. 다시 한 번 감사드립니다! –

+0

readInputStreamToFile()을 상당히 단순화 할 수 있습니다. 'sizeToRead'는 'size'의 복사본이며 변경하지 않으므로 'size'를 사용하십시오. 그리고 if/else는 curRead = in.read (buffer, 0, (int) Math.min (buffer.length, size-totalRead))로 대체 될 수 있습니다. – EJP

+0

대단히 fredcrs와 EJP에 감사드립니다. 귀하의 논리와 함께 나는 파일을 전송 관리했습니다. 모두 잘 작동합니다. 누구든지 소스 코드에 관심이 있다면 메시지를 남겨두면 게시됩니다. –

관련 문제