一、回传协议接口和 udp 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. 实现 : :
import java.net.socketAddress; Java.nio.Channels import.*; import java.nio.bytebuffer; import java.io.ioexception; 공개 클래스 udpechoselectorprotocol emplements <span style = "font-size : 1em; line-height : 1.5;"> echoprotocol </span> <span spyle = "font-size : 1em; line-height : 1.5;"> {</span> private static final echomax = 255; // Echo Datagram 정적 클래스 클라이언트 리코드의 최대 크기 {public socketaddress clientAddress; public bytebuffer buffer = bytebuffer.allocate (echomax); } public void handleeccep (selectionKey Key)는 ioException {} public void handleread (selectionKey 키)가 IoException {datagramChannel 채널 = (DataGramChannel) key.channel (); clientRecord clntrec = (clientRecord) key.AttACHMENT (); clntrec.buffer.clear (); // clntrec.clientAddress를 받기 위해 버퍼 준비 = channel.receive (clntrec.buffer); if (clntrec.clientAddress! = null) {// 우리가 뭔가를 받았습니까? // reggist selector key.interestOps (selectionKey.op_write)에 쓰기; }} public void handwrite (selectionKey 키)는 ioException {datagramChannel 채널 = (DatagramChannel) key.channel (); clientRecord clntrec = (clientRecord) key.AttACHMENT (); clntrec.buffer.flip (); // int bytessent를 보내기 위해 버퍼 준비 = channel.send (clntrec.buffer, clntrec.clientAddress); if (bytessent! = 0) {// 완전히 작성 되었습니까? // 더 이상 writes key.interestOps (selectionKey.op_read)에 관심이 없습니다. }}}二、 NIO UDP 客户端 :
import java.net.inetSocketAddress; import java.net.socketexception; import java.nio.bytebuffer; import java.nio.channels.datagramchannel; 공개 클래스 udpechoclientnonblocking {private static final int timeout = 3000; // 타임 아웃 (밀리 초) 비공개 정적 최종 int maxtries = 255; // 최대 retransmissions public static void main (String args [])은 예외를 {// 입력 문자열을 기본 숯 바이트 바이트로 바이트로 변환합니다 [] bytestosend = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".getBytes (); // 채널을 만들고 비 차단으로 설정하여 DatagramChannel DataGramChannel = DataGramChannel.open (); DatagramChannel.configureBlocking (false); DatagramChannel.socket (). setSotimeout (timeout); 바이트 버퍼 writebuf = bytebuffer.wrap (bytestosend); 바이트 버퍼 readbuf = bytebuffer.allocate (maxtries); DatagramChannel = DataGramChannel.connect (New InetSocketAddress ( "127.0.0.1", 5500); int totalbytesrcvd = 0; // 지금까지 수신 된 총 바이트는 int bytesrcvd; // 마지막 읽기에서 수신 된 바이트 (TotalBytesrcvd <bytestosend.length) {if (writebuf.hasremaining ()) {datagramchannel.write (writeBuf); } if ((bytesrcvd = datagramChannel.read (readBuf)) == -1) {Throw New PocketException ( "연결이 조기에 닫힌 연결"); } TotalByTesrcvd += bytesrcvd; System.out.print ( "."); // 다른 작업} system.out.println ( "수신 :" + new String (readbuf.array (), 0, TotalBytesrcvd); DatagramChannel.close (); }}三、 NIO UDP 服务端 :
import java.io.ioexception; import java.net.inetSocketAddress; Java.nio.Channels import.*; import java.util.iterator; 공개 클래스 udpechoserverselector {private static final int timeout = 3000; // 대기 시간 초과 (밀리 초) public static void main (string [] args)은 ioexception {// 멀티 플렉스 클라이언트 연결에 선택기를 만듭니다. selector selector = selector.open (); DatagramChannel 채널 = DataGramChannel.open (); channel.configureBlocking (false); channel.socket (). bind (new inetSocketAddress (5500)); channel.register (selector, selectionkey.op_read, new udpechoselectorProtocol.clientRecord ()); udpechoselectorprotocol echoselectorProtocol = 새로운 udpechoselectorProtocol (); while (true) {// 영원히 실행, 데이터 그램을 수신하고 에코링 // 작업을 기다리거나 타임 아웃이 만료 될 때까지 (selector.select (timeout) == 0) {system.out.print ( "."); 계속하다; } // I/O가있는 키 세트에서 ITERATOR <SelectionKey> keyiter = selector.SelectedKeys (). iterator (); while (keyiter.hasnext ()) {selectionkey key = keyiter.next (); // 키는 비트 마스크입니다. // 클라이언트 소켓 채널은 데이터가 보류 중입니까? if (key.isreadable ()) echoselectorProtocol.handleread (key); // 클라이언트 소켓 채널은 쓰기에 사용할 수 있으며 // 키는 유효합니다 (즉, 채널이 닫히지 않음). if (key.isvalid () && key.iswritable ()) echoselectorprotocol.handlewrite (key); keyiter.remove (); }}}}以上就是本文的全部内容 以上就是本文的全部内容, 查看更多 java 的语法, 大家可以关注 : 《Java에서 생각하는 사고 中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》, 也希望大家多多支持武林网。