一、回传协议接口和 TCP p :
1. : :
import java.nio.channels.selectionkey; import java.io.ioexception; 공개 인터페이스 echoprotocol {void handleycrect (selectionKey 키)는 ioException을 던졌습니다. void handleread (selectionKey 키)는 ioException을 던졌습니다. void handswrite (selectionKey 키)는 ioException을 던졌습니다. }2. 实现 : :
Java.nio.Channels import.*; import java.nio.bytebuffer; import java.io.ioexception; 공개 클래스 TcpechoselectorProtocol은 Echoprotocol {private int bufsize; // I/O 버퍼의 크기 public echoselectorProtocol (int bufsize) {this.bufsize = bufsize; } public void handleccep (selectionKey Key) IoException {socketchannel clntchan = ((serversocketchannel) key.channel ()). accept (); clntchan.configureBlocking (false); // register // 셀렉터를 읽기 및 첨부 첨부 할 수 있도록 선택기를 등록하지 않아야합니다. clntchan.register (key.selector (), selectionKey.Op_read, bytebuffer.allocate (bufsize)); } public void handleread (selectionKey Key)는 ioException을 던졌습니다. {// 클라이언트 소켓 채널은 데이터가 보류 중입니다. 바이트 버퍼 buf = (Bytebuffer) key.attachment (); long bytesread = clntchan.read (buf); if (bytesread == -1) {// 다른 쪽 끝이 가까이 있었습니까? clntchan.close (); } else if (bytesRead> 0) {// 키를 통해 읽기/쓰기가 모두 관심이 있음을 나타냅니다. key.interestOps (selectionkey.op_read | selectionkey.op_write); }} public void handswrite (selectionKey 키)는 ioException을 던졌습니다 { / * * 채널은 쓰기에 사용할 수 있으며 키는 유효합니다 (즉, 클라이언트 채널 *이 닫히지 않음). */ // 데이터 검색 이전 읽기 바이 테 버퍼 buf = (bytebuffer) key.attachment (); buf.flip (); // booketchannel clntchan = (socketchannel) key.channel (); clntchan.write (buf); if (! buf.hasremaining ()) {// 완전히 작성 되었습니까? // 남은 것이 없으므로 더 이상 writes key.interestOps (selectionkey.op_read)에 관심이 없습니다. } buf.compact (); // 더 많은 데이터를 읽을 수있는 공간}}二、 NIO TCP 客户端 :
import java.net.inetSocketAddress; import java.net.socketexception; import java.nio.bytebuffer; import java.nio.channels.socketchannel; 공개 클래스 tcpechoclientNonBlocking {public static void main (String Args [])은 예외 {String server = "127.0.0.1"; // 서버 이름 또는 IP 주소 // 기본 숯을 사용하여 입력 문자열을 바이트로 변환합니다 [] argument = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".getBytes (); int servport = 5500; // 채널을 만들고 비 블로킹으로 설정하여 socketchannel clntchan = socketchannel.open (); clntchan.configureBlocking (false); // if (! clntchan.connect (new inetSocketdress (Server, Servport))) {while (! clntchan.finishConnect ()) {System.out.print ( "."); // 다른 작업}} bytebuffer writebuf = bytebuffer.wrap (argument); 바이트 버퍼 readbuf = bytebuffer.allocate (argument.length); int totalbytesrcvd = 0; // 지금까지 수신 된 총 바이트는 int bytesrcvd; // 마지막 읽기에서 수신 된 바이트 (TotalBytesrcvd <argument.length) {if (writeBuf.hasRemaining ()) {clntchan.write (writeBuf); } if ((bytesrcvd = clntchan.read (readbuf)) == -1) {Throw New PocketException ( "연결이 조기에 닫힌 연결"); } TotalByTesrcvd += bytesrcvd; System.out.print ( "."); // 다른 작업} system.out.println ( "수신 :" + // 기본적으로 문자열로 변환 새 문자열 (readbuf.array (), 0, totalbytesrcvd) .length ()); clntchan.close (); }}三、 NIO TCP 服务端 :
import java.io.ioexception; import java.net.inetSocketAddress; Java.nio.Channels import.*; import java.util.iterator; 공개 클래스 tcpserverselector {private static final int bufsize = 256; // 버퍼 크기 (바이트) 비공개 정적 최종 int 타임 아웃 = 3000; // 대기 시간 초과 (밀리 초) public static void main (String [] args)은 ioexception {int [] ports = {5500}; // 멀티플렉스 청취 소켓 및 연결로 선택기를 만듭니다. selector selector = selector.open (); // 각 포트에 대한 청취 소켓 채널 및 (int port : ports) {serversocketchannel listnchannel = serversocketchannel.open (); listnchannel.socket (). bind (new inetSocketAddress (port)); listnchannel.configureBlocking (false); // 채널에 셀렉터를 등록하려면 차단되지 않아야합니다. 반환 된 키는 무시됩니다. listnchannel.register (selector, selectionkey.op_accept); } // 프로토콜을 구현하는 핸들러를 만듭니다. while (true) {// 영원히 실행, 사용 가능한 I/O 작업 // 일부 채널이 준비 될 때까지 기다립니다 (또는 타임 아웃) if (selector.select (timeout) == 0) {// ready chans system.out.print ( "."); 계속하다; } // I/O가있는 키 세트에서 ITERATOR <SelectionKey> keyiter = selector.SelectedKeys (). iterator (); while (keyiter.hasnext ()) {selectionkey key = keyiter.next (); // 키는 비트 마스크 // 서버 소켓 채널이 연결중인 연결 요청이 있습니까? if (key.isacceptable ()) {system.out.println ( "---- 수락 -----"); 프로토콜.handleAccep (키); } // 클라이언트 소켓 채널에 데이터가 보류 중입니까? if (key.isreadable ()) {System.out.println ( "---- 읽기 -----"); 프로토콜.handleread (키); } // 클라이언트 소켓 채널을 작성할 수 있고 // 키가 유효합니다 (즉, 채널이 닫히지 않음)? if (key.isvalid () && key.iswritable ()) {system.out.println ( "---- 쓰기 -----"); 프로토콜.handlewrite (키); } keyiter.remove (); // 선택한 키 세트에서 제거}}}}以上就是本文的全部内容 以上就是本文的全部内容, 查看更多 java 的语法, 大家可以关注 : 《Java에서 생각하는 사고 中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》, 也希望大家多多支持武林网。