NIO socket 서버에서 주의할 점.
1. 읽기 이벤트를 등록합니다.
클라이언트가 처음 연결했을 때 읽기 이벤트를 등록합니다.
이후는 매번 데이터를 다 쓴 후에 이벤트를 등록하고 읽는 것이다.
2. 이벤트 등록
매번 논리를 처리한 후에 이벤트를 등록하고 되돌릴 결과를 socket Channel.write(response Line Buffer)를 작성합니다.
3. 데이터를 읽을 때 주의한다.
// .
int responseSize;
// .
ByteBuffer requestLineBuffer = ByteBuffer.allocate(1024);
* 예를 들어 클라이언트가 1024바이트를 보내왔습니다.이렇게 하면 Request Line Buffer가 한 번에 1024바이트까지 읽을 수 있습니다.이 때responseSize==requestLineBuffer에 있는 데이터의 크기입니다.이것이 바로 네가 필요로 하는 완전한 데이터다.
* 클라이언트가 100바이트를 보내면이 때responseSize
앞의 두 가지 상황은 바로 당신이 원하는 것입니다.responseSize<=requestLineBuffer의 데이터 크기입니다.
* 클라이언트가 2048바이트를 보내면 처음에는 최대 1024바이트의 데이터를 읽을 수 있습니다.이 때responseSize>requestLineBuffer, 당신은 처음에 데이터를 완전하게 읽지 않았다면 나머지 1024바이트의 수를 다시 읽어야 한다고 판단해야 합니다.
이런 상황은 아마 네가 이미 생각했을 것이다.하지만 아래에는 두 가지 괴이한 상황이 있다.
* 클라이언트가 2048바이트를 보냈지만 2회 또는 여러 번으로 나누어 보냈습니다. 예를 들어 지난 두 번에 1548바이트를 읽었을 때 전체 데이터를 받지 못했다고 판단하고 intcount = socketChannel을 사용하십시오.read(requestLineBuffer);읽으면 데이터를 읽을 수 없다.그러면 이번에 읽은 데이터를 저장하고 읽은 이벤트를 등록해서 읽고, 다음에 나머지 500바이트 데이터를 읽은 후에 논리를 처리해야 한다.이런 상황이 바로 socket Channel입니다.read의 데이터는 한 번에 데이터를 읽는 것이 아니라 여러 번 나누는 것이다.
*마지막 상황은 클라이언트가 5000바이트를 보냈지만 매번 요청한 데이터가 1000바이트에 불과하다는 것이다. 이것은 클라이언트가 너무 빨리 보내거나 서버 처리가 느리다는 것을 의미한다. 시스템은 이 5차례의 요청한 데이터를 함께 추가했다.이때 너는 이 다섯 개의 요청을 하나하나 꺼내서 상응하는 논리를 처리해야 한다.
//
key.interestOps(key.interestOps()&~SelectionKey.OP_WRITE);
//
key.interestOps(key.interestOps()&~SelectionKey.OP_READ);
key.cancel();
// .
int count = socketChannel.read(requestLineBuffer);
if (count <= -1) {
close();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IBM Portal에서 자동 JSP 재부팅 활성화포털 서버를 다시 시작하지 않고 주제와 외관 JSP에 대한 변경 사항을 보려면 응용 프로그램 서버에서 JSP의 새 버전을 자동으로 검사하도록 강제할 수 있습니다.이것은 개발과 테스트 목적에 이상적이지만 성능 문제로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.