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();

 
 

좋은 웹페이지 즐겨찾기