一、回传协议接口和 udp 方式实现 :
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.net.socketaddress; impor java.nio.channels.*; impor java.nio.bytebuffer; impor java.io.ioException; Kelas Publik UdpechoselectorProtocol mengimplementasikan <span style = "font-size: 1em; line-height: 1.5;"> echoprotocol </span> <span style = "font-size: 1em; line-height: 1.5;"> {</span> private static final int echomax = 255; // Ukuran maksimum Echo Datagram Static Class ClientRecord {Public SocketAddress ClientAddress; buffer bytebuffer publik = byteBuffer.allocate (echomax); } public void handleAccept (kunci selection) melempar ioException {} public void handleread (kunci selection) melempar ioException {datagramchannel channel = (datagramchannel) key.channel (); Clientrecord clntrec = (clientrecord) key.attachment (); clntrec.buffer.clear (); // Siapkan buffer untuk menerima clntrec.clientAddress = channel.receive (clntrec.buffer); if (clntrec.clientAddress! = null) {// Apakah kita menerima sesuatu? // Daftarkan Tulis dengan kunci pemilih.Interestops (selectionkey.op_write); }} public void handwrite (kunci selection) melempar ioException {datagramchannel channel = (datagramchannel) key.channel (); Clientrecord clntrec = (clientrecord) key.attachment (); clntrec.buffer.flip (); // Siapkan buffer untuk mengirim int bytessent = channel.send (clntrec.buffer, clntrec.clientAddress); if (bytessent! = 0) {// buffer tertulis sepenuhnya? // tidak lagi tertarik menulis key.Interestops (selectionKey.op_read); }}}二、 nio udp : :
impor java.net.inetsocketaddress; impor java.net.socketexception; impor java.nio.bytebuffer; impor java.nio.channels.datagramchannel; kelas publik udpechoclientnonblocking {private static final int timeout = 3000; // Kirimkan kembali batas waktu (milidetik) private static final int maxtries = 255; // Retransmisi maksimum public static void main (string args []) melempar Exception {// konversi string input ke byte menggunakan charset byte default [] bytestoSend = "0123456789AbcDefgHiJKlMnopQrStuVwxyz". // Buat saluran dan atur ke nonblocking datagramchannel datagramchannel = datagramchannel.open (); datagramchannel.configureblocking (false); datagramchannel.socket (). setSoTimeout (timeout); Bytebuffer writeBuf = byteBuffer.wrap (bytestoSend); Bytebuffer readbuf = byteBuffer.allocate (maxtries); datagramchannel = datagramchannel.connect (inetsocketAddress baru ("127.0.0.1", 5500)); int totalbytesrcvd = 0; // total byte yang diterima sejauh ini int bytesrcvd; // byte yang diterima dalam bacaan terakhir sementara (TotalByTesRcvd <bytestoSend.length) {if (writeBuf.hasremaining ()) {datagramchannel.write (writeBuf); } if ((bytesrcvd = datagramchannel.read (readbuf)) == -1) {lempar SocketException baru ("koneksi tertutup prematur"); } TotalByTesRCVD += BYTESRCVD; System.out.print ("."); // lakukan sesuatu yang lain} system.out.println ("Diterima:" + string baru (readbuf.array (), 0, TotalBytesRcvd)); datagramchannel.close (); }}三、 nio udp : :
impor java.io.ioException; impor java.net.inetsocketaddress; impor java.nio.channels.*; impor java.util.iterator; kelas publik UDPechoServerLector {private static final int timeout = 3000; // tunggu timeout (milidetik) public static void main (string [] args) melempar ioException {// Buat selektor ke koneksi klien multipleks. Selector selector = selector.open (); Datagramchannel channel = datagramchannel.open (); channel.configureblocking (false); channel.socket (). Bind (inetsocketAddress baru (5500)); channel.register (selector, selectionKey.op_read, udpechoselectorprotocol.clientRecord ()) baru; Udpechoselectorprotocol echoselectorprotocol = baru udpechoselectorprotocol (); while (true) {// jalankan selamanya, menerima dan menggemakan datagrams // tunggu tugas atau sampai batas waktu berakhir jika (selector.select (timeout) == 0) {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 // saluran soket klien memiliki data yang tertunda? if (key.isreadable ()) echoselectorprotocol.handleread (key); // Saluran Soket Klien tersedia untuk menulis dan // Key valid (yaitu, saluran tidak ditutup). if (key.isvalid () && key.iswritable ()) echoselectorprotocol.handlewrite (key); keyiter.remove (); }}}}以上就是本文的全部内容 , 查看更多 Java 的语法 , 大家可以关注 : 《Berpikir di Java 中文手册》、《 JDK 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》 , , ,