一、回传协议接口和 TCP 方式实现 :
1. : :
impor java.nio.channels.selectionKey; impor java.io.ioException; echoprotocol antarmuka publik {void handleaccept (kunci selection) melempar ioException; void handleread (kunci selection) melempar ioException; void handwrite (kunci selection) melempar ioException; }2. : :
impor java.nio.channels.*; impor java.nio.bytebuffer; impor java.io.ioException; kelas publik tcpechoselectorprotocol mengimplementasikan echoprotocol {private int bufsize; // ukuran I/O buffer echoselectorprotocol publik (int bufsize) {this.bufsize = bufsize; } public void handleAccept (kunci selection) melempar ioException {socketchannel clntchan = ((serversocketchannel) key.channel ()). accept (); clntchan.configureblocking (false); // Harus menjadi nonblocking untuk mendaftar // mendaftar pemilih dengan saluran baru untuk baca dan lampirkan byte buffer clntchan.register (key.selector (), selectionKey.op_read, bytebuffer.allocate (bufsize)); } public void handleread (kunci seleksi) melempar ioException {// saluran soket klien telah menunggu data socketchannel clntchan = (socketchannel) key.channel (); Bytebuffer buf = (bytebuffer) key.attachment (); long bytesread = clntchan.read (buf); if (bytesread == -1) {// Apakah yang lain berakhir tutup? clntchan.close (); } lain jika (bytesread> 0) {// menunjukkan melalui kunci bahwa membaca/menulis keduanya menarik sekarang. key.Interestops (selectionKey.op_read | selectionkey.op_write); }} public void handwrite (kunci selection) melempar IoException { / * * saluran tersedia untuk ditulis, dan kunci valid (yaitu, saluran klien * tidak ditutup). */ // Ambil data yang dibaca sebelumnya BytEbuffer buf = (byteBuffer) key.Attachment (); buf.flip (); // Siapkan buffer untuk menulis socketchannel clntchan = (socketchannel) key.channel (); clntchan.write (buf); if (! buf.hasremaining ()) {// buffer sepenuhnya ditulis? // tidak ada yang tersisa, jadi tidak lagi tertarik untuk menulis key.Interestops (selectionKey.op_read); } buf.compact (); // memberi ruang untuk lebih banyak data dibaca di}}二、 nio tcp : :
impor java.net.inetsocketaddress; impor java.net.socketexception; impor java.nio.bytebuffer; impor java.nio.channels.socketchannel; kelas publik tcpechoclientnonblocking {public static void main (string args []) melempar pengecualian {string server = "127.0.0.1"; // Nama Server atau Alamat IP // Konversi String Input ke Byte Menggunakan Charset Byte Default [] Argument = "0123456789ABCDEFGHIJKLMNOPQRSUVWXYZ" .getBytes (); int servport = 5500; // Buat saluran dan atur ke socketchannel nonblocking clntchan = socketchannel.open (); clntchan.configureblocking (false); // memulai koneksi ke server dan berulang kali polling sampai lengkap jika (! Clntchan.connect (inetsocketAddress baru (server, servport))) {while (! Clntchan.finishconnect ()) {System.out.print ("."); // Lakukan sesuatu yang lain}} bytebuffer writeBuf = byteBuffer.wrap (argumen); Bytebuffer readbuf = byteBuffer.allocate (argumen.length); int totalbytesrcvd = 0; // total byte yang diterima sejauh ini int bytesrcvd; // byte yang diterima di terakhir baca sementara (TotalBytesRcvd <argument.length) {if (writeBuf.hasremaining ()) {clntchan.write (writeBuf); } if ((bytesrcvd = clntchan.read (readbuf)) == -1) {lempar SocketException baru ("koneksi tertutup prematur"); } TotalByTesRCVD += BYTESRCVD; System.out.print ("."); // Lakukan sesuatu yang lain} System.out.println ("Diterima:" + // Konversi ke String per string baru charset default (readbuf.array (), 0, TotalByTesRCVD) .length ()); clntchan.close (); }}三、 nio tcp : :
impor java.io.ioException; impor java.net.inetsocketaddress; impor java.nio.channels.*; impor java.util.iterator; kelas publik tcpserverselector {private static final int bufsize = 256; // Ukuran buffer (byte) private static final int timeout = 3000; // tunggu timeout (milidetik) public static void main (string [] args) melempar ioException {int [] ports = {5500}; // Buat pemilih untuk soket mendengarkan multipleks dan koneksi selector selector = selector.open (); // Buat saluran soket mendengarkan untuk setiap port dan daftar pemilih untuk (int port: port) {serversocketchannel listNchannel = serversocketchannel.open (); listnchannel.socket (). bind (inetsocketaddress baru (port)); listnchannel.configureblocking (false); // Harus menjadi nonblocking untuk mendaftar // mendaftar pemilih dengan saluran. Kunci yang dikembalikan diabaikan listnchannel.register (selector, selectionkey.op_accept); } // Buat pawang yang akan mengimplementasikan protokol TCPPROTOCOL Protocol = tcpechoselectorprotocol baru (bufsize); while (true) {// jalankan selamanya, pemrosesan operasi I/O yang tersedia // tunggu beberapa saluran siap (atau timeout) if (selector.select (timeout) == 0) {// mengembalikan # dari ready chans system.out.print ("."); melanjutkan; } // Dapatkan iterator pada set tombol dengan I/O untuk memproses iterator <decticeKey> keyiter = selector.selectedKeys (). Iterator (); while (keyiter.hasnext ()) {selectionKey key = keyiter.next (); // Kunci adalah Bit Mask // Server Socket Channel memiliki permintaan koneksi yang tertunda? if (key.isacceptable ()) {System.out.println ("---- terima -----"); Protocol.HandleAccept (Key); } // saluran soket klien memiliki data yang tertunda? if (key.isreadable ()) {System.out.println ("---- baca -----"); protocol.handleread (kunci); } // saluran soket klien tersedia untuk menulis dan // kunci valid (yaitu, saluran tidak ditutup)? if (key.isvalid () && key.iswritable ()) {System.out.println ("---- tulis -----"); Protocol.Handewrite (Key); } keyiter.remove (); // Hapus dari set tombol yang dipilih}}}}以上就是本文的全部内容 , 查看更多 Java 的语法 , 大家可以关注 : 《Berpikir di Java 中文手册》、《 JDK 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》 , , ,