一、回传协议接口和 udp方式实现:
1.接口:
java.nio.channels.selectionKeyをインポートします。 java.io.ioexceptionをインポートします。パブリックインターフェイスechoprotocol {void handLeaccept(selectionkey key)がioexceptionをスローします。 void handleread(selectionkey key)はioexceptionをスローします。 void handlewrite(selectionkey key)はioexceptionをスローします。 }2.实现:
java.net.socketaddressをインポートします。 java.nio.channels。*; java.nio.bytebufferをインポートします。 java.io.ioexceptionをインポートします。パブリッククラスのudpechoselectorprotocol emplyents <span style = "font-size:1em; line-height:1.5;"> echoprotocol </span> <span style = "font-size:1em; line-height:1.5;"> {</span> private static final intecomax = 255; // echo datagramの最大サイズstatic class clientrecord {public socketaddress clientAddress; public bytebuffer buffer = bytebuffer.allocate(echomax); } public void handLeaccept(selectionkey key)throws ioexception {} public void handleread(selectionkey key)throws ioexception {datagramchannel channel =(datagramchannel)key.channel(); clientRecord clntrec =(clientRecord)key.attachment(); clntrec.buffer.clear(); // clntrec.clientAddress = channel.receive(clntrec.buffer)を受信するためのバッファーを準備します。 if(clntrec.clientAddress!= null){//何かを受け取りましたか? // selector key.interestops(selectionkey.op_write)に書き込みます。 }} public void handlewrite(selectionkey key)throws ioexception {datagramchannel channel =(datagramchannel)key.channel(); clientRecord clntrec =(clientRecord)key.attachment(); clntrec.buffer.flip(); // int bytessent = channel.send(clntrec.buffer、clntrec.clientAddress)を送信するためにバッファーを準備します。 if(bytessent!= 0){//バッファーは完全に書かれていますか? // key.interestops(selectionkey.op_read)を書き込むことにもう興味がありません。 }}}二、 nio udp客户端:
java.net.inetsocketAddressをインポートします。 java.net.socketexceptionをインポートします。 java.nio.bytebufferをインポートします。 java.nio.channels.datagramchannelをインポートします。パブリッククラスudpechoclientnonblocking {private static final int timeout = 3000; //再送信タイムアウト(ミリ秒)プライベート静的最終int maxtries = 255; //最大再送信public static void main(string args [])throws exception {//入力文字列をデフォルトのcharset byte [] bytestosend = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" .GETBYTES(); //チャンネルを作成し、非ブロッキングに設定しますdatagramChannel datagramChannel = datagramChannel.open(); datagramchannel.configureblocking(false); datagramChannel.Socket()。setSotimeout(Timeout); bytebuffer writebuf = bytebuffer.wrap(bytestosend); bytebuffer 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){new socketexception( "接続は閉じた"); } totalbytesrcvd += bytesrcvd; System.out.print( "。"); //何か他のことを行う} system.out.println( "受信:" + new String(readbuf.array()、0、totalbytesrcvd)); datagramchannel.close(); }}三、 nio udp服务端:
java.io.ioexceptionをインポートします。 java.net.inetsocketAddressをインポートします。 java.nio.channels。*; java.util.iteratorをインポートします。パブリッククラスudpechoserverselector {private static final int timeout = 3000; //待機タイムアウト(Milliseconds)public static void main(string [] args)throws ioException {//セレクターを作成してクライアント接続をマルチプレックスします。 selector selector = selector.open(); DatagramChannel Channel = datagramChannel.open(); Channel.ConfigureBlocking(false); Channel.Socket()。bind(new inetsocketAddress(5500)); Channel.register(selector、selectionkey.op_read、new udpechoselectorProtocol.clientRecord()); udpechoselectorprotocol echoselectorprotocol = new udpechoselectorprotocol(); while(true){//永久に実行し、データグラムを受信してエコーします//タスクを待つか、タイムアウトが失効するまで(selector.select(Timeout)== 0){System.out.print( "。");続く; } // I/Oを使用したキーのセットでITERATORを取得して、ITERATOR <SelectionKey> keyiter = selector.selecturedKeys()。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的语法、大家可以关注:shink javaでの思考中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 api java