لقد كتبت مقالًا من قبل: ملخص برمجة Java Network IO (Bio و Nio و AIO جميعهم يحتوي على رمز مثيل كامل) ، والذي يقدم كيفية استخدام دعم IO الأصلي Java لبرمجة الشبكة. تقدم هذه المقالة طريقة أبسط ، وهي إطار Java Nio.
Netty هي واحدة من أكثر أطر عمل NIO شعبية في الصناعة ، مع المتانة الجيدة والوظائف والأداء والتخصيص وقابلية التوسع. في الوقت نفسه ، يوفر واجهة برمجة تطبيقات بسيطة للغاية تبسط بشكل كبير برمجة الشبكات الخاصة بنا.
مثل المقالة التي قدمتها Java IO ، تنفذ الأمثلة الموضحة في هذه المقالة نفس الوظيفة.
1. جانب الخادم
الخادم:
حزمة com.anxpp.io.calculator.netty ؛ استيراد io.netty.bootstrap.serverbootstrap ؛ استيراد io.netty.channel.channelfuture ؛ استيراد io.netty.channel.channelinitializer ؛ استيراد io.netty.channel.channeloption ؛ استيراد io.netty.channel.eventloopgroup ؛ استيراد io.netty.channel.nio.nioeventloopgroup ؛ استيراد io.netty.channel.socket.socketchannel ؛ استيراد io.netty.channel.socket.nio.nioserversocketchannel ؛ خادم الفئة العامة {Private Int Port ؛ الخادم العام (منفذ int) {this.port = port ؛ } public void run () يلقي استثناء {eventLoopGroup bossgroup = nioeventloopgroup () ؛ EventLoopGroup WorkerGroup = nioeventloopgroup () جديد ؛ حاول {serverBootStrap b = new serverbootstrap () ؛ B.Group (Bossgroup ، WorkerGroup) .Channel (nioserversocketchannel.class) .Option (ChannelOption.so_backlog ، 1024) .ChildOption (channeloption.so_keepalive ، true) .ChildHandhandler (channelinitializer <OcketchAnlizer> () CH.Pipeline (). AddLast (New ServerHandler ()) ؛ channelfuture f = b.bind (port) .sync () ؛ System.out.println ("Server on:"+port) ؛ F.Channel (). closefuture (). sync () ؛ } أخيرًا {workergroup.shutdowngracely () ؛ bossgroup.shutdownlyly () ؛ }} public static void main (string [] args) يلقي الاستثناء {int port ؛ if (args.length> 0) {port = integer.parseint (args [0]) ؛ } آخر {port = 9090 ؛ } خادم جديد (منفذ) .run () ؛ }}ServerHandler:
حزمة com.anxpp.io.calculator.netty ؛ استيراد io.netty.buffer.bytebuf ؛ استيراد io.netty.buffer.unpooled ؛ استيراد io.netty.channel.channelhandlercontext ؛ استيراد io.netty.channel.channelinboundHandlerAdapter ؛ استيراد java.io.unsupportedencodingException ؛ استيراد com.anxpp.io.utils.calculator ؛ يمتد ServerHandler Public ServerHandler channelinBoundLerDerAdapter {Override Public Void ChannelRead (ChannelHandlerContext CTX ، Object MSG) يرمي UnsupportedEncodingException {bytebuf في = (bytebuf) msg ؛ byte [] req = new byte [in.ReadableBytes ()] ؛ in.ReadBytes (req) ؛ سلسلة body = سلسلة جديدة (req ، "utf-8") ؛ System.out.println ("رسالة العميل المستلمة:"+الجسم) ؛ سلسلة calrresult = null ؛ حاول {calrresult = calculator.instance.cal (الجسم) .ToString () ؛ } catch (استثناء e) {calrresult = "error expression:" + e.getMessage () ؛ } ctx.write (unpooled.copiedbuffer (calrresult.getbytes ())) ؛ } Override public void ChannelReadComplete (ChannelHandLerContext CTX) يلقي الاستثناء {ctx.flush () ؛ } / *** معالجة الاستثناء* / Override public void stisplycaught (ChannelHandLerContext CTX ، cause throw) {cause.printStackTrace () ؛ ctx.close () ؛ }} package com.anxpp.io.calculator.netty ؛ استيراد io.netty.buffer.bytebuf ؛ استيراد io.netty.buffer.unpooled ؛ استيراد io.netty.channel.channelhandlercontext ؛ استيراد io.netty.channel.channelinboundHandlerAdapter ؛ استيراد java.io.unsupportedencodingException ؛ استيراد com.anxpp.io.utils.calculator ؛ يمتد ServerHandler Public ServerHandler channelinBoundLerDerAdapter {Override Public Void ChannelRead (ChannelHandlerContext CTX ، Object MSG) يرمي UnsupportedEncodingException {bytebuf في = (bytebuf) msg ؛ byte [] req = new byte [in.ReadableBytes ()] ؛ in.ReadBytes (req) ؛ سلسلة body = سلسلة جديدة (req ، "utf-8") ؛ System.out.println ("رسالة العميل المستلمة:"+الجسم) ؛ سلسلة calrresult = null ؛ حاول {calrresult = calculator.instance.cal (الجسم) .ToString () ؛ } catch (استثناء e) {calrresult = "error expression:" + e.getMessage () ؛ } ctx.write (unpooled.copiedbuffer (calrresult.getbytes ())) ؛ } Override public void ChannelReadComplete (ChannelHandLerContext CTX) يلقي الاستثناء {ctx.flush () ؛ } / *** معالجة الاستثناء* / Override public void stisplycaught (ChannelHandLerContext CTX ، cause throw) {cause.printStackTrace () ؛ ctx.close () ؛ }} 2. العميل
عميل:
حزمة com.anxpp.io.calculator.netty ؛ استيراد io.netty.bootstrap.bootstrap ؛ استيراد io.netty.channel.channelfuture ؛ استيراد io.netty.channel.channelinitializer ؛ استيراد io.netty.channel.channeloption ؛ استيراد io.netty.channel.eventloopgroup ؛ استيراد io.netty.channel.nio.nioeventloopgroup ؛ استيراد io.netty.channel.socket.socketchannel ؛ استيراد io.netty.channel.socket.nio.niosocketchannel ؛ استيراد java.util.scanner ؛ يقوم عميل الفئة العامة بتنفيذ Runnable {static ClientHandler Client = New ClientHandler () ؛ static static void main (string [] args) يلقي الاستثناء {new thread (new client ()). start () ؛ suppressWarnings ("Resource") Scanner Scanner = New Scanner (System.in) ؛ بينما (client.sendmsg (scanner.nextline ())) ؛ } Override public void run () {String Host = "127.0.0.1" ؛ INT PORT = 9090 ؛ EventLoopGroup WorkerGroup = nioeventloopgroup () جديد ؛ حاول {bootstrap b = new Bootstrap () ؛ B.Group (WorkerGroup) ؛ B.Cannel (niosocketchannel.class) ؛ B.Option (ChannelOption.so_keepalive ، true) ؛ B.Handler (New ChannelInitializer <AcketchAnl> () {Override public void initchannel (SocketchAnnel CH) يلقي الاستثناء {ch.pipeline (). addlast (client) ؛}}) ؛ channelfuture f = b.connect (مضيف ، منفذ) .sync () ؛ F.Channel (). closefuture (). sync () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } أخيرًا {workergroup.shutdowngracely () ؛ }}}ClientHandler:
حزمة com.anxpp.io.calculator.netty ؛ استيراد io.netty.buffer.bytebuf ؛ استيراد io.netty.buffer.unpooled ؛ استيراد io.netty.channel.channelhandlercontext ؛ استيراد io.netty.channel.channelinboundHandlerAdapter ؛ استيراد java.io.unsupportedencodingException ؛ يمتد ClientHandler من الفئة العامة إلى channelInBoundLerDAdapter {ChannelHandLerContext CTX ؛ / *** استدعاء بعد استئناف رابط TCP ناجح*/ Override Public Void Channelactive (ChannelHandLerContext CTX) يلقي الاستثناء {this.ctx = ctx ؛ } public boolean sendmsg (string msg) {system.out.println ("العميل يرسل رسالة:"+msg) ؛ byte [] req = msg.getBytes () ؛ bytebuf m = unpooled.buffer (req.length) ؛ M.WriteBytes (req) ؛ CTX.WriteAndflush (M) ؛ إرجاع msg.equals ("س")؟ خطأ: صحيح ؛ } / *** اتصل بعد استلام رسالة الخادم* throws UnsupportedEncodingException* / Override public void ChannelRead (ChannelHandlerContext CTX ، Object MSG) يرمي UnsupportedEncodingException {bytebuf buf = (bytebuf) msg ؛ byte [] req = new byte [buf.ReadableBytes ()] ؛ buf.Readbytes (req) ؛ سلسلة body = سلسلة جديدة (req ، "utf-8") ؛ System.out.println ("رسالة الخادم:"+الجسم) ؛ } / *** يسمى عند حدوث استثناء* / Override public void stisplycaught (ChannelHandlerContext CTX ، cause throw) {cause.printstacktrace () ؛ ctx.close () ؛ }} 3. أدوات للحساب
package com.anxpp.io.Utils ؛ import javax.script.scriptengine ؛ import javax.script.scriptengeneManager ؛ import javax.script.scriptexception ؛ public enum calculator {estance ؛ scriptengine static النهائي الخاص = جديد scriptengenemanager (). getEngineByName ("JavaScript") ؛ الكائن العام cal (تعبير السلسلة) يلقي scriptexception {return jse.eval (التعبير) ؛ }} 4. اختبار
ابدأ الخادم والعميل على التوالي ، ثم أدخل التعبير على وحدة تحكم العميل:
1+5+5+5+5+5+5+5+5+5+5+5+5+5*4/4/4/5/5/5/5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+4/4/4
يمكنك رؤية النتائج التي يتم إرجاعها بواسطة الخادم.
عرض وحدة التحكم في الخادم:
يتم تمكين الخادم: 9090 رسالة عميل مستلمة: 1+5+5+5+5+5 رسالة عميل مستلمة: 156158*458918+125615 رسالة عميل مستلمة: 1895612+555+5+5+5+5+5+5+5-5*4/4
5. أكثر
المقالات ذات الصلة:
ملخص برمجة شبكة Java Network IO (Bio ، NIO ، AIO جميعها تحتوي على رمز مثيل كامل)
عنوان GIT Code المصدر لهذا المثال و Java Bio Nio Aio مثال: https://github.com/anxpp/java-io.git
سيستمر تحديث المحتوى المتعلق بـ Netty حتى يتم إكمال خادم اتصال بسيط.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.