>Java >java지도 시간 >JAVA-7NIO지소켓/서버소켓 채널

JAVA-7NIO지소켓/서버소켓 채널

巴扎黑
巴扎黑원래의
2017-06-26 09:58:011035검색

1. ServerSocketChannel

Java NIO의 ServerSocketChannel은 표준 IO의 ServerSocket과 마찬가지로 새로 들어오는 TCP 연결을 모니터링할 수 있는 채널입니다. ServerSocketChannel 클래스는 java.nio.channels 패키지에 있습니다.

ServerSocketChannel 열기

ServerSocketChannel.open() 메서드를 호출하여 ServerSocketChannel을 엽니다.

ServerSocketChannel을 닫습니다

ServerSocketChannel.close() 메서드를 호출하여 ServerSocketChannel을 닫습니다.

새 들어오는 연결을 수신합니다

ServerSocketChannel.accept ( ) 메소드가 청취합니다. 새로 들어오는 연결을 위해. accept() 메서드가 반환되면 새로 들어오는 연결이 포함된 SocketChannel을 반환합니다. 따라서 accept() 메서드는 새 연결이 도착할 때까지 차단됩니다.

일반적으로 하나의 연결을 듣고 while 루프에서 accept() 메서드를 호출하는 것이 아닙니다.

물론 while 루프에서 true 외에 다른 종료 기준을 사용할 수도 있습니다.

비차단 모드

ServerSocketChannel은 비차단 모드로 설정할 수 있습니다. 비차단 모드에서는 accept() 메서드가 즉시 반환됩니다. 새로 들어오는 연결이 없으면 반환 값은 null이 됩니다. 따라서 반환된 SocketChannel이 null인지 확인해야 합니다. 예:

    /** * socket server channel     */@Testpublic void text2() throws IOException {
        ServerSocketChannel channel = ServerSocketChannel.open();    //新建channelchannel.socket().bind(new InetSocketAddress(9999));     //监听端口channel.configureBlocking(true);                             //设置阻塞while (true) {
            SocketChannel accept = channel.accept();                    //设置为阻塞,则此方法阻塞,直到有连接//如果设置为非阻塞,需要在这里判断 accept == null?ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
            accept.read(byteBuffer);
            byteBuffer.flip();                                    //反转while (byteBuffer.hasRemaining()) {                   //判断System.err.println((char)byteBuffer.get());       //输出            }
        }
    }

2. Java의 SocketChannel

SocketChannel은 TCP 네트워크 소켓에 연결된 채널입니다. SocketChannel은 다음 2가지 방법으로 생성할 수 있습니다.

  1. SocketChannel을 열고 인터넷의 서버에 연결합니다.

  2. ServerSocketChannel에 새 연결이 도착하면 SocketChannel이 생성됩니다. E 소켓 채널 열기

  3. 다음은 소켓 채널을 여는 방법입니다.

소켓 채널 닫기

SocketChannel을 사용하여 소켓 채널을 호출할 때.close() 소켓 채널 닫기:

소켓 채널에서 데이터를 읽어 so에서 읽습니다. , read() 메서드 중 하나를 호출합니다.

먼저 버퍼를 할당합니다. SocketChannel에서 읽은 데이터는 이 버퍼에 배치됩니다.

그런 다음 SocketChannel.read()를 호출하세요. 이 메서드는 SocketChannel의 데이터를 Buffer로 읽습니다. read() 메서드에서 반환된 int 값은 버퍼로 읽혀진 바이트 수를 나타냅니다. -1이 반환되면 스트림의 끝을 읽었음을 의미합니다(연결이 닫혔습니다).

Write to SocketChannel

SocketChannel에 데이터를 쓰는 작업은 Buffer를 매개변수로 사용하는 SocketChannel.write() 메서드를 사용합니다.

SocketChannel.write() 메서드는 while 루프에서 호출됩니다. Write() 메서드는 SocketChannel에 쓸 수 있는 바이트 수를 보장할 수 없습니다. 따라서 버퍼에 쓸 바이트가 없을 때까지 write()를 반복적으로 호출합니다.

비차단 모드

SocketChannel을 비차단 모드로 설정할 수 있습니다. 설정 후 비동기 모드에서 connect(), read() 및 write()를 호출할 수 있습니다.

connect()

SocketChannel이 비차단 모드이고 이때 connect()가 호출되면 연결이 설정되기 전에 메서드가 반환될 수 있습니다. 연결이 설정되었는지 확인하려면 FinishConnect() 메서드를 호출하면 됩니다.

write()

비차단 모드에서는 내용이 작성되기 전에 write() 메서드가 반환될 수 있습니다. 따라서 루프에서 write()를 호출해야 합니다. 이전에도 예시가 있었으므로 여기서는 자세히 다루지 않겠습니다.

read()

비차단 모드에서는 데이터를 읽기 전에 read() 메서드가 반환될 수 있습니다. 따라서 읽은 바이트 수를 알려주는 int 반환 값에 주의를 기울여야 합니다.

비차단 모드 및 선택기

비차단 모드는 선택기와 함께 더 잘 작동합니다. 하나 이상의 SocketChannel을 선택기에 등록하면 선택기에게 읽기, 쓰기 등이 가능한 채널을 물어볼 수 있습니다. Selector와 SocketChannel의 조합에 대해서는 나중에 자세히 설명하겠습니다.

/** * socket channel     */@Testpublic void test3() throws IOException {
        SocketChannel channel = SocketChannel.open();                               //新建服务端channel.connect(new InetSocketAddress("127.0.0.1",9999));   //连接服务端地址ByteBuffer byteBuffer = ByteBuffer.allocate(1024);  //缓冲区byteBuffer.put("123".getBytes());
        byteBuffer.flip();                                  //反转while (byteBuffer.hasRemaining()) {                 //判断            channel.write(byteBuffer);
        }
    }

위 내용은 JAVA-7NIO지소켓/서버소켓 채널의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.