一、回传协议接口和 TCP方式实现:
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.nio.channels。*; java.nio.bytebufferをインポートします。 java.io.ioexceptionをインポートします。パブリッククラスTCPECHOSELECRECTORPROTOCOLはECHOPROTOCOL {private int bufsize; // I/Oバッファーのサイズpublic echoselectorprotocol(int bufsize){this.bufsize = bufsize; } public void handLeaccept(selectionkey key)throws ioexception {socketchannel clntchan =((serversocketchannel)key.channel())。 clntchan.configureblocking(false); //登録するためにノンブロッキングをしている必要があります// byteバッファーclntchan.register(key.selector()、selectionkey.op_read、bytebuffer.allocate(bufsize))の読み取りと添付の新しいチャネルでセレクターを登録する必要があります。 } public void handleread(selectionkey key)throws ioexception {//クライアントソケットチャネルには保留中のデータSocketchannel clntchan =(socketchannel)key.channel(); bytebuffer 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 handlewrite(selectionkey key)throws ioexception { / * *チャンネルは書き込みに使用でき、キーは有効です(つまり、クライアントチャネル *が閉じていません)。 */ //データの取得以前のbytebuffer buf =(bytebuffer)key.attachment(); buf.flip(); // socketchannel clntchan =(socketchannel)key.channel()を書き込むためのバッファーを準備する; clntchan.write(buf); if(!buf.hasremaining()){//バッファーは完全に書かれていますか? //何も残っていないので、key.interestops(selectionkey.op_read)を書き込むことにはもう興味がありません。 } buf.compact(); //より多くのデータを読むためのスペースを作成してください}}二、nio tcp客户端:
java.net.inetsocketAddressをインポートします。 java.net.socketexceptionをインポートします。 java.nio.bytebufferをインポートします。 java.nio.channels.socketchannelをインポートします。 public class tcpechoclientnonblocking {public static void main(string args [])throws exception {string server = "127.0.0.1"; //サーバー名またはIPアドレス//入力文字列をデフォルトのcharset byte [] argument = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" .GETBYTES(); int servport = 5500; //チャンネルを作成し、socketchannel clntchan = socketchannel.open(); clntchan.configureblocking(false); //サーバーへの接続を開始し、if(!clntchan.connect(new inetsocketAddress(server、servport))))))を完了するまで繰り返しポーリングするまでポーリングします。 //何か他のことをする}} bytebuffer writebuf = bytebuffer.wrap(argument); bytebuffer 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 socketexception( "接続閉じて閉じて"); } totalbytesrcvd += bytesrcvd; System.out.print( "。"); //何か他のことを行う} system.out.println( "receive:" + //デフォルトのcharset new String(readbuf.arreay()、0、totalbytesrcvd).length())。 clntchan.close(); }}三、nio tcp服务端:
java.io.ioexceptionをインポートします。 java.net.inetsocketAddressをインポートします。 java.nio.channels。*; java.util.iteratorをインポートします。パブリッククラスtcpserverselector {private static final int bufsize = 256; //バッファーサイズ(バイト)プライベート静的最終intタイムアウト= 3000; // wait timeout(milliseconds)public static void main(string [] args)throws ioexception {int [] ports = {5500}; //マルチプレックスリスニングソケットと接続にセレクターを作成しましたselector = selector.open(); //各ポートのリスニングソケットチャネルを作成し、(intポート:ポート){serversocketchannel listnchannel = serversocketchannel.open(); listnchannel.socket()。bind(new inetsocketAddress(port)); listnchannel.configureblocking(false); //登録するにはノンブロッキングである必要があります//セレクターをチャネルに登録します。返されたキーは、listnchannel.register(selector、selectionkey.op_accept)を無視されます。 } //プロトコルTCPPROTOCOL Protocol = new TCPECHOSELECTREPROTOCOL(BUFSIZE)を実装するハンドラーを作成します。 while(true){//永久に実行する、利用可能なI/O操作を処理//いくつかのチャネルが準備ができている(またはタイムアウト)if(selector.select(Timeout)== 0){// ready chans system.out.print( "。")の#を返します。続く; } // I/Oを使用したキーのセットでITERATORを取得して、ITERATOR <SelectionKey> keyiter = selector.selecturedKeys()。iterator(); while(keyiter.hasnext()){selectionkey key = keyiter.next(); //キーはビットマスクです//サーバーソケットチャンネルには保留中の接続要求がありますか? if(key.isacectable()){system.out.println( "---- accept -----"); Protocol.HandleAccept(key); } //クライアントソケットチャネルには保留中のデータがありますか? if(key.isreadable()){system.out.println( "----読み取り-----"); protocol.handleread(key); } //クライアントソケットチャネルは書き込みに使用でき、//キーは有効です(つまり、チャネルが閉じていない)? if(key.isvalid()&& key.iswritable()){system.out.println( "---- write -----"); protocol.handlewrite(key); } keyiter.remove(); //選択したキーのセットから削除}}}}以上就是本文的全部内容、查看更多、查看更多java的语法、大家可以关注:shink javaでの思考中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 api java