一、回传协议接口和 TCP : :
1. : :
استيراد java.nio.channels.selectionKey ؛ استيراد java.io.ioException ؛ الواجهة العامة echoprotocol {void HandleAccept (مفتاح SelecteKey) يلقي ioException ؛ باطل معالج (مفتاح تحديد مفتاح الاختيار) يلقي ioException ؛ void المعدات (مفتاح Selectekey) يلقي ioException ؛ }2. : :
استيراد java.nio.channels.*؛ استيراد java.nio.bytebuffer ؛ استيراد java.io.ioException ؛ الطبقة العامة tcpechoselectorprotocol تنفذ echoprotocol {private int bufsize ؛ // حجم I/O Buffer echoselectorprotocol (int bufsize) {this.bufsize = bufsize ؛ } public void HandleAccept (SelecteKey Key) يلقي ioException {SocketchAnnel clntchan = ((serversocketchannel) key.channel ()). قبول () ؛ clntchan.configureBlocking (false) ؛ // يجب أن يكون عدم الحظر لتسجيل // تسجيل المحدد مع قناة جديدة للقراءة وإرفاق Byte Buffer Clntchan.register (key.selector () ، selectekey.op_read ، bytebuffer.allocate (bufsize)) ؛ } public void handlead (Selectekey Key) يلقي IoException {// قناة مقبس العميل لها بيانات Socketchannel clntchan = (socketchannel) key.channel () ؛ bytebuffer buf = (bytebuffer) key.attachment () ؛ bytesread = clntchan.read (buf) ؛ if (bytesread == -1) {// هل أغلق الطرف الآخر؟ clntchan.close () ؛ } آخر إذا (bytesRead> 0) {// أشر عبر المفتاح أن القراءة/الكتابة كلاهما من الاهتمام الآن. key.InterestOps (selectekey.op_read | selectekey.op_write) ؛ }} public void wandwrite (مفتاح Selectekey) يلقي IoException { / * * القناة متاحة للكتابة ، والمفتاح صالح (أي ، قناة العميل * غير مغلقة). */// استرداد البيانات قراءة في وقت سابق bytebuffer buf = (bytebuffer) key.attachment () ؛ buf.flip () ؛ // إعداد المخزن المؤقت لكتابة socketchannel clntchan = (socketchannel) key.channel () ؛ clntchan.write (buf) ؛ if (! buf.hasremaining ()) {// buffer مكتوب تماما؟ // لم يتبق شيء ، لذلك لم يعد مهتمًا بكتابة key.InterestOps (selectekey.op_read) ؛ } buf.compact () ؛ // إفساح المجال لمزيد من البيانات في}}二、 nio tcp 客户端 :
استيراد java.net.inetsocketaddress ؛ استيراد java.net.socketException ؛ استيراد java.nio.bytebuffer ؛ استيراد java.nio.channels.socketchannel ؛ الفئة العامة TCPechoclientNonblocking {public static void main (String args []) rems {String server = "127.0.0.1" ؛ // اسم الخادم أو عنوان IP // تحويل سلسلة الإدخال إلى Bytes باستخدام Byte charset الافتراضي [] الوسيطة = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" .getBytes () ؛ int servport = 5500 ؛ // إنشاء قناة وتعيين على Socketchannel غير المحظور = socketchannel.open () ؛ clntchan.configureBlocking (false) ؛ // ابدأ الاتصال بالخادم واستطلاع الاستطلاع مرارًا وتكرارًا إذا كان (! clntchan.connect (new inetsocketaddress (server ، servport)))) // افعل شيئًا آخر}} bytebuffer writebuf = bytebuffer.wrap (الوسيطة) ؛ bytebuffer readBuf = bytebuffer.allocate (PINGUMINE.Length) ؛ int totalBytesrcvd = 0 ؛ // إجمالي البايتات المستلمة حتى الآن int bytesrcvd ؛ // bytes المستلمة في آخر قراءة بينما (TotalBytesrcvd <pigument.length) {if (trintbuf.hasRemaining ()) {clntchan.write (trintbuf) ؛ } if ((bytesrcvd = clntchan.Read (readBuf)) == -1) {رمي socketException ("connection مغلق قبل الأوان") ؛ } totalBytesrcvd += bytesrcvd ؛ system.out.print (".") ؛ // افعل شيئًا آخر} system.out.println ("تم استلامه:" + // تحويل إلى سلسلة لكل charset charset new string (readBuf.array () ، 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 int = 3000 ؛ // مهلة الانتظار (milliseconds) الفراغ الثابت العام (سلسلة [] args) يلقي ioException {int [] المنافذ = {5500} ؛ // قم بإنشاء محدد إلى مآخذ الاستماع المتعددة و Connections Selector = celector.open () ؛ // قم بإنشاء قناة مقبس الاستماع لكل منفذ وتسجيل محدد لـ (منفذ int: المنافذ) {serversocketchannel listnchannel = serversocketchannel.open () ؛ listnchannel.socket () listnchannel.configureBlocking (false) ؛ // يجب أن تكون غير محظورة لتسجيل // تسجيل المحدد مع القناة. يتم تجاهل المفتاح الذي تم إرجاعه listnchannel.register (selector ، selectekey.op_accept) ؛ } // إنشاء معالج من شأنه تنفيذ بروتوكول tcpprotocol البروتوكول = جديد tcpechoselectorprotocol (bufsize) ؛ بينما (صحيح) {// Run Forever ، فإن معالجة عمليات الإدخال/الإخراج المتاحة // انتظر حتى تكون بعض القنوات جاهزة (أو مهلة) if (selector.select (timeout) == 0) {// returns # of ready chans system.out.print (".") ؛ يكمل؛ } // احصل على iterator على مجموعة من المفاتيح مع I/O لمعالجة ITerator <SelecteKey> keyiter = selector.selectedkeys (). iterator () ؛ بينما (keyiter.hasnext ()) {selectekey key = keyiter.next () ؛ // المفتاح هو Bit Mask // Server Socket Cannel لديها طلبات اتصال معلقة؟ if (key.isacceptable ()) {system.out.println ("---- قبول -----") ؛ protocol.HandleAccept (مفتاح) ؛ } // قناة مقبس العميل لديها بيانات معلقة؟ if (key.isReadable ()) {system.out.println ("---- read -----") ؛ protocol.handleread (مفتاح) ؛ } // قناة مقبس العميل متاحة للكتابة و // المفتاح صالح (أي ، القناة غير مغلقة)؟ if (key.isvalid () && key.iswitable ()) {system.out.println ("---- الكتابة -----") ؛ protocol.handlewrite (مفتاح) ؛ } keyiter.remove () ؛ // إزالة من مجموعة المفاتيح المحددة}}}}以上就是本文的全部内容 , 查看更多 java 的语法 , : : 《التفكير في java 中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 api java 中文参考手册》、《 jdk 1.5 api java 中文参考手册》 , 也希望大家多多支持武林网。