(심혈 을 기울 여) HttpRequest 대상 으로 서버 의 바 이 너 리 데 이 터 를 가 져 옵 니 다.
텍스트 기반 내용 / 데이터 상호작용 에 만 사용 할 수 있 습 니 다.미 친 구 글 에서 하루 를 보 낸 결과 내 판단 이 어색 하고 정확 하 다 는 것 도 확인 됐다.
인터넷 에서 10 명 에 게 물 어보 면 9 명 이 XMLHttpRequest 는 텍스트 만 상호작용 할 수 있다 는 것 을 알려 줄 것 이다. 사실은 전혀 그렇지 않다. 너무 많은 사람들 이 손 에 넣 자마자 HttpRequest 대상 의 특성 을 연구 하 는 것 이 아니 라 프레임 워 크 를 사용 하기 시 작 했 기 때 문인 지 모 르 겠 지만 Response Body 의 사용 에 대해 서 는 언급 하 는 사람 이 거의 없다 는 것 은 아 쉬 운 일이 다.우선, 나 는 다음 글 을 찾 아 HttpRequest 대상 의 속성 과 방법 을 상세 하 게 설명 했다.
http://blog.chinaunix.net/u2/61797/showart_1000687.html
안에 있 는 물건 은 그대로 베 끼 지 않 겠 습 니 다. 여 기 는 '속성: response Body' 라 는 속성 에 대한 설명 만 주의 하 세 요.분명히 JQuery 의 몇 개의 AJAX 함수 만 으로 는 데 이 터 를 되 돌려 주 는 것 을 처리 할 수 없습니다. 이 경우 XML HttpRequest 에 직접 주 는 대화 함 수 를 직접 작성 할 수 밖 에 없습니다.
이 글 에 따 르 면 response Body 는 IE8 Debugger 에 'Array of Byte' 로 표 시 된 바 이 너 리 구조 다.실제로 이 데이터 구 조 는 VB / C 의 Byte 배열 과 호 환 됩 니 다. 예 를 들 어 VB 에서 우 리 는 이렇게 Byte 배열 을 정의 합 니 다.
Dim bytes(10) As Byte
그러나 js / vbs 는 이러한 데이터 구 조 를 지원 하지 않 습 니 다. ByteArray 는 js 에 있어 메모리 의 특수 한 대상 일 뿐 그 구 조 는 js 에 있어 서 완전히 투명 합 니 다. 스 크 립 트 는 메모리 주 소 를 사용 하여 인용 을 얻 을 수 있 지만 이 투명 물 체 를 조작 할 수 없습니다.js 가 할 수 있 는 일 은 이 대상 의 주소 인용 을 가지 고 이 데 이 터 를 처리 할 수 있 는 다른 구성 요소 나 프로그램 에 패스 하 는 것 입 니 다.
많은 사람들 이 response Body 라 는 속성 을 평생 사용 하지 않 을 수도 있 기 때문에 내 가 왜 그렇게 필요 한 지 설명 할 필요 가 있다.내 프로젝트 에 서 는 servlet 로 TIF 파일 흐름 을 제공 한 다음 클 라 이언 트 js 가 이 바 이 너 리 스 트림 의 데 이 터 를 받 아들 여 이미지 탐색 구성 요소 에 전달 할 수 있 는 메커니즘 이 필요 합 니 다.이 프로 세 스 의 핵심 문 제 는 이미지 탐색 구성 요소 (ActiveX) 는 ByteArray 의 바 이 너 리 데이터 만 받 아들 일 수 있 기 때문에 모든 방법 을 다 강구 하여 ByteArray 대상 을 얻어 야 한 다 는 것 이다.
본인 이 response Body 를 의식 하지 못 하기 전에 순진 하 게 생각 했다. 1) ByteArray 는 js 가 식별 할 수 있 는 Array 대상 이다.2) HttpRequest 는 텍스트 데이터 만 전송 할 수 있 습 니 다.이런 독선 적 인 사상 지도 아래 나 는 첫 번 째 해결 방안 을 제시 했다.
1) 서버 Servlet 에서 파일 흐름 을 가 져 온 후 byte by byte 를 읽 은 다음 JSON 형식의 문자열 로 조립 합 니 다. 예 를 들 어 "[72, 43, 43, 0, 38...]" 형식 입 니 다.
2) PrintWriter. print () 방법 을 통 해 이 JSON 문자열 을 클 라 이언 트 js 의 리 셋 함수 에 보 내 고 이 리 셋 함수 에서 JSON 문자열 을 js 배열 로 변환 합 니 다.
3) 이 js 배열 의 모든 요 소 는 byte 데이터 (범위 0 ~ 255 내 정수) 이기 때문에 이 js 배열 을 ByteArray 매개 변수 로 이미지 탐색 구성 요소 에 직접 전송 하고 그림 을 표시 합 니 다.
그러나 ByteArray 의 데이터 성질 을 잘 인식 하지 못 했 기 때문에 상기 방안 은 실 패 했 습 니 다. 이미지 구성 요 소 는 매개 변수 형식 이 일치 하지 않 아 오류 가 발생 했 습 니 다.또한 모든 byte 가 텍스트 로 변 환 된 후에 전송 되 기 때문에 이 상호작용 행위 에 필요 한 실제 네트워크 트 래 픽 은 원래 바 이 너 리 파일 의 용량 (* 비고 의 환산 참조) 을 훨씬 초과 합 니 다.
response Body 에 관 한 정 보 를 읽 은 후에 저 는 ByteArray 데 이 터 를 받 을 수 있다 고 믿 습 니 다. 문 제 는 Servlet 이 데 이 터 를 어떻게 써 야 response Body 에 ByteArray 를 전달 할 수 있 는 지 입 니 다.먼저 제 가 생각 한 것 은 response. getOutputStream () 입 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
File file = new File("c:\\001.tif");
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream out = response.getOutputStream();
int b = 0;
int len = 0;
byte[] buf = new byte[1024];
while ((len = bis.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.flush();
out.close();
bis.close();
사실은 이 실험 이 성공 하지 못 했다 는 것 을 증명 한다. 클 라 이언 트 에 도착 한 ByteArray 데 이 터 는 놀 라 울 정도 로 많 고 servlet 의 OutputStream 에 대해 아무런 연구 도 하지 않 아 원인 을 알 수 없다.그래서 나 는 다음 코드 를 다시 시도 했다.
File file = new File("c:\\001.tif");
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
PrintWriter out = resp.getWriter();
byte[] buf = new byte[1024];
int len = 0;
try {
while ((len = in.read(buf)) != -1) {
char[] cbuf = byteArray2CharArray(buf);
write(cbuf, 0, len);
out.flush();
}
} catch (IOException ex) {
ex.printStackTrace();
}
그 중에서 byteArray 2CharArray () 방법의 실현 을 저 는 쓰 지 않 겠 습 니 다. 한 마디 로 하면 byteArray 를 하나의 charArray 로 번역 하 는 기능 입 니 다. 각 요소 의 정수 절대 치 는 변 하지 않 습 니 다 (JVM 에서 byte 든 char 든 마지막 에 int 로 표시 되 지만 char 는 마이너스 이기 때문에 절대 치 를 사용 합 니 다).여기 서 이상 합 니 다. 실험 은 여전히 성공 하지 못 했 습 니 다. 클 라 이언 트 response Body 는 size 의 정확 한 ByteArray 를 받 았 지만 안의 데 이 터 는 정확 하지 않 습 니 다. Buffered 의 읽 기 방식 에서 어떤 byte 값 이 마이너스 라 는 것 은 상당히 이상 하고 정확 하지 않 기 때 문 입 니 다.그 다음 에 약간 '멍청 하 다' 는 방법 이 성공 을 거 두 었 다.
File file = new File("c:\\001.tif");
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
PrintWriter out = resp.getWriter();
int b = 0;
while ((b = bis.read()) != -1) {
out.write(b);
}
out.flush();
out.close();
bis.close();
결국 이 는 PrintWriter. write (int b) 방법 으로 성공 을 거 두 었 고 클 라 이언 트 는 정확 한 ByteArray 데 이 터 를 받 았 으 며 이미지 파일 도 정확하게 복원 되 고 표시 되 었 습 니 다.
마지막 방법 이 성공 을 거 두 었 지만 필 자 는 마음 이 불편 하 다. buffer 를 사용 하지 않 았 기 때문에 몇 개의 byte 가 write (int b) 방법 을 몇 번 호출 해 야 하 는 지, JDK 의 소스 코드 를 보면 이 방법 은 강제 동기 화 되 고 자물쇠 방출 자물쇠 등 추가 비용 을 받 는 것 을 잊 을 수 없다. 이렇게 쓰 면 성능 이 좋 을 수 없다.현재 PrintWriter 의 계승 을 고려 하고 있 으 며, 이 방면 에서 깨 달 은 친구 들 이 함께 교류 할 수 있 기 를 바 랍 니 다.byte [] 의 버퍼 읽 기 방식 에 왜 이상 한 데이터 가 나 왔 는 지 아직도 마음 에 걸 립 니 다. JBoss 의 실현 소스 코드 를 보 러 갈 시간 이 없어 서 연구 하 는 친구 들 에 게 아 낌 없 는 가르침 을 청 할 수 밖 에 없습니다.
* 비고: 예 를 들 어 121 이라는 정 수 는 byte 형식 일 때 1 개의 바이트 만 차지 하고 문자열 '121' 은 6 개의 바이트 만 차지 합 니 다. 모든 문자 char 가 2 개의 바이트 만 차지 하기 때 문 입 니 다.게다가 JSON 배열 을 연결 하 는 데 사용 해 야 합 니 다. "구분자 로 도 2 개의 바이트 를 차지 해 야 합 니 다. 머리 끝 에 있 는 상대방 의 괄호 가 4 개의 문 자 를 차지 하 는 것 은 무시 합 니 다.따라서 하나의 ByteArray 에 있 는 데이터 가 모두 (byte) 121 이 라 고 가정 하면 문자열 로 해석 되면 그 크기 는 원본 데이터 의 약 8 배 이 고 네트워크 기반 프로그램 에 있어 서 이러한 결함 은 용납 할 수 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.