2017-09-21 7 views
1

Java 서버에서 C 클라이언트로 텍스트 파일을 보내려고합니다. 코드를 실행 한 후에 텍스트 파일을 성공적으로 받았지만 텍스트 파일에 임의의 데이터가 삽입되어 있음을 알았습니다.Java 서버에서 C 클라이언트로 텍스트 파일 보내기

파일을 전송하기위한 서버 코드입니다.

public void sendFile(Socket socket, String file) throws IOException 
{ 
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
    FileInputStream fis = new FileInputStream(file); 
    byte[] buffer = new byte[256]; 

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

    fis.close(); 
    dos.close();  
} 

그리고이 파일을 수신하기위한 클라이언트 코드입니다.

int recv_file(int sock, char* file_name) 
{ 
    char send_str [MAX_SEND_BUF]; 
    int fp; 
    int sent_bytes, rcvd_bytes, rcvd_file_size; 
    int recv_count; 
    unsigned int recv_str[MAX_RECV_BUF]; 
    size_t send_strlen; 
    send_strlen = strlen(send_str); 
    if ((fp = open(file_name, O_WRONLY|O_CREAT, 0644)) < 0) 
    { 
      perror("error creating file"); 
      return -1; 
    } 
    recv_count = 0; 
    rcvd_file_size = 0; 
    while ((rcvd_bytes = recv(sock, recv_str, MAX_RECV_BUF/*256*/, 0)) > 0) 
    { 
      recv_count++; 
      rcvd_file_size += rcvd_bytes; 
      if (write(fp, recv_str, rcvd_bytes) < 0) 
      { 
        perror("error writing to file"); 
        return -1; 
      } 
      printf("%dThe data received is %u\n", ++count, recv_str); 
    } 
    close(fp); 
    printf("Client Received: %d bytes in %d recv(s)\n", rcvd_file_size, recv_count); 
    return rcvd_file_size; 
} 

그리고 이것은 클라이언트 측에서 수신 한 텍스트 파일입니다. Received text file

이 횡설수설이 텍스트 파일에 추가되었는데이 문제를 어떻게 해결합니까?

+2

Java에서는 읽고 쓰는 것 이상을 쓰는 것 같습니다. Java에서 읽은 데이터의 양을 확인하고 해당 부분 만 DOS에 기록하십시오. –

+1

'DataOutputStream' 필요/원하지 않아요! 소켓의 일반 출력 스트림을 사용하십시오! – JimmyB

+1

@JimmyB 그가'DataOutputStream' 또는 소켓의 출력 스트림을 사용하는지 여부는 아무런 차이가 없습니다. – EJP

답변

1

여기서 이점이 없으므로 DataOutputStream을 사용하면 안됩니다. 소켓에서 일반 OutputStream 만 사용하십시오.

그런 다음 파일에있는만큼의 데이터를 기록해야합니다.

그래서 대신

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

사용

OutputStream os = socket.getOutputStream(); 
int len; 
while ((len = fis.read(buffer)) > 0) { 
    os.write(buffer,0,len); 
} 

파일에 있기 때문에 당신은 단지 많은 바이트를 쓰기 확인합니다.

+0

이것은 완벽하게 작동했습니다! 솔루션을 가져 주셔서 감사합니다! – KulaDamian

+0

'DataOutputStream'은 확실히 여기에 중복됩니다 * 특정 메소드가 호출되지 않았으므로 쓰는 데이터를 인코딩하지 않습니다 *. 여기서 유일한 문제는 복사 루프에있었습니다. – EJP

+0

@EJB 네 말이 맞아. 나는'ObjectOutputStream'에 대해 생각하고 있었다. 내 대답을 바로 잡을거야. – JimmyB

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

복사 루프가 잘못되었습니다. 이전이 아닌 경우 파일의 끝에 정크 메일을 쓰고 있습니다. 다음과 같아야합니다.

int count; 
while ((count = fis.read(buffer)) > 0) { 
    dos.write(buffer, 0, count); 
} 
+0

예, 파일의 끝에 코드가 추가되어 카운터 변수가 문제를 해결했습니다. – KulaDamian