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 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
최근 문제가 되고 있는 서버 스레드 중단 문제 해결우리의 응용 프로그램은 인터넷 하드디스크와 같은 다운로드 도구로 사이트의 방문량이 비교적 적지만 문제가 우리를 계속 괴롭히고 있다. 바로was 서버가 일정 시간 간격으로 라인을 끊고 시간이 길고 짧으며 5분 안에 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.