2017-03-29 3 views
0

현재이 질문에 문제가 있습니다. 이 질문에 대한 , 내가 가지고 :소켓을 통한 데이터 압축 및 압축 해제

클라이언트 측 : 서버로 전송, 콘솔에서 각 입력 라인을 압축하고 서버에서

서버 측을 각 메시지를 압축 해제 : 클라이언트에서 데이터를 압축 해제, 변경 낮은 대문자로 된 대문자를 압축하여 클라이언트에게 다시 보냅니다.

내가 할 수있는 최선의 방법은 위의 모든 작업을 단 한 줄로 수행하는 것입니다.

클라이언트 측 :

/* SOCKET CONNECTING STUFF UP HERE */ 

    /*PROBLEMS START AROUND HERE */ 
    String line; 
    BufferedReader bis = new BufferedReader(new InputStreamReader(System.in)); 

    DeflaterOutputStream compress = new DeflaterOutputStream(socket.getOutputStream(), true); 


    InflaterInputStream decompress = new InflaterInputStream(socket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 

    line = bis.readLine(); 

    line = line + "\n"; 
    compress.write(line.getBytes(), 0, line.length()); 
    compress.finish(); 
    System.out.println("Message sent: " + line); 
    System.out.println("Message Returned : " +fromClient.readLine()); 

    /* closing the streams here */ 
    bis.close(); 
    decompress.close(); 
    compress.close(); 
    fromClient.close(); 
    socket.close(); 
} 

} 

서버 사이드 :

String line = ""; 
    OutputStream outstream = new FileOutputStream("compessserver.txt"); 

    InflaterInputStream decompress = new InflaterInputStream(clientsocket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 
    DeflaterOutputStream compress = new DeflaterOutputStream(clientsocket.getOutputStream()); 

    while ((line = fromClient.readLine()) != null) { 
     String upperLine = line.toUpperCase(); 
     System.out.println("Message received and converted: " + upperLine); 
     System.out.println(); 
     upperLine = upperLine + "\n"; 
     byte[] input = upperLine.getBytes(); 
     outstream.write(input); 
     outstream.write("\r\n".getBytes()); 
     compress.write(input); 
     System.out.println("Message returned : " + upperLine); 
     compress.finish(); 
     if (upperLine.equalsIgnoreCase("x")) { 
      break; 
     } 

    } 

    decompress.close(); 
    compress.close(); 
    fromClient.close(); 
    outstream.close(); 
    socket.close(); 
} 
} 

난 정말이 도움을 주시기 바랍니다해야합니다. 이 다중 입력을 대신 만들려고하면 전체 코드가 엉망이됩니다. 며칠 동안 이랬어.

편집 : 이것을 언급하는 것을 잊어 버려. 내가 할 일은 줄을 입력하고, 압축하고, 서버에 보내고, 서버가 압축을 풀고 대문자를 압축하고, 압축하여 클라이언트에게 보냅니다. 내가 경우,

내가 그것을 여러 줄

두 번째 시도 클라이언트 측 작동하도록 다음 코드를 시도 프로그램을 종료합니다 "Q"와 같은 단일 문자에 넣어 때까지 그리고 나는 더 입력 라인에 가정 :

String line; 
    BufferedReader bis = new BufferedReader(new InputStreamReader(System.in)); 

    DeflaterOutputStream compress = new DeflaterOutputStream(socket.getOutputStream(), true); 


    InflaterInputStream decompress = new InflaterInputStream(socket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 
    line = bis.readLine(); 
    while ((!line.equalsIgnoreCase("x"))) { 
     compress.write(line.getBytes(), 0, line.length()); 
     System.out.println("Message sent: " + line); 
     System.out.println("Message returned:" +fromClient.readLine()); 
     line = bis.readLine(); 
    } 

    bis.close(); 
    fromClient.close(); 
    socket.close(); 
} 

}

두 번째 시도의 서버 측 :

OutputStream outstream = new FileOutputStream("compessserver.txt"); 
    InflaterInputStream decompress = new InflaterInputStream(clientsocket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 
    DeflaterOutputStream compress = new DeflaterOutputStream(clientsocket.getOutputStream()); 

    while ((line = fromClient.readLine()) != null) { 
     String upperLine = line.toUpperCase(); 
     System.out.println("Message received and converted: " + upperLine); 
     System.out.println(); 
     upperLine = upperLine + "\n"; 
     byte[] input = upperLine.getBytes(); 
     outstream.write(input); 
     outstream.write("\r\n".getBytes()); 
     compress.write(input); 
     System.out.println("Message returned : " + upperLine); 

     if (upperLine.equalsIgnoreCase("x")) { 
      break; 
     } 

    } 

    decompress.close(); 
    fromClient.close(); 
    outstream.close(); 
    socket.close(); 
} 

}

+0

무엇이 문제입니까? 너는 무엇을 기대하고 있니? 대신 무엇이 발생합니까? – cubrr

+0

콘솔에 한 줄을 입력하면 작동하도록 할 수 있습니다. 내가 할 일은 줄을 입력하고, 압축하고, 서버에 보내고, 서버가 압축을 풀고 대문자를 압축하고, 압축하여 클라이언트에게 보냅니다. 그리고 나서 "Q"와 같은 한 글자를 넣을 때까지 더 많은 줄을 입력해야합니다. – BeyondDays

+0

두 줄로 시도하면 어떻게됩니까? 그것은 당신이 뭔가를 입력하고 Enter 키를 누르면 요청이 실행되고 서버가 적절한 응답을 반환하면 클라이언트 프로그램이 종료됩니까? 프로그램에서 두 번째 줄을 물어야한다고 생각하는 코드 줄을 지적 할 수 있습니까? –

답변

0

이러한 스트림은 대화 형으로 사용할 수 없습니다. 매번 글을 쓸 때마다 또는 매번 읽기 전이라면 finish()으로 전화해야합니다. 이는 한 번만 쓸 수 있다는 것을 의미합니다. 대화 형 요청/응답 세션이 아닌 대규모 단방향 스트림 용으로 설계되었습니다.

어쨌든 단선을 압축하여 얻는 이점은 없습니다. 압축을 시작하기 위해서는 많은 양의 데이터가 필요합니다.

NB compress.write(line.getBytes(), 0, line.length())은 유효하지 않습니다. String의 문자 수가 변환 될 때의 바이트 수와 같다고 가정합니다. 항상 그렇지는 않습니다. compress.write(line.getBytes(), 0, line.getBytes().length())이거나 더 간단하게는 compress.write(line.getBytes())이어야합니다.

+0

그래서이 경우 입력 줄을 먼저 텍스트 파일에 넣고 compress 그걸 서버에 넘겨 줘? DeflaterOutputStream은 괜찮 았나? – BeyondDays

+0

@BeyondDays'DeflaterOutputStream'이 더 나은 옵션입니다. 텍스트 파일을 작성하는 것은 확실히 쓸모가 없습니다. 압축 파일을 작성한 다음 전송하면 필요없는 많은 대기 시간이 추가됩니다. – EJP

관련 문제