Ich habe zuvor einen Artikel geschrieben: Java Network IO -Programmierzusammenfassung (Bio, NIO und AIO enthalten alle vollständige Instanzcode), in der die Verwendung von Java Native IO -Unterstützung für die Netzwerkprogrammierung verwendet wird. In diesem Artikel wird eine einfachere Methode eingeführt, nämlich das Java -Nio -Framework.
Netty ist eines der beliebtesten NIO -Frameworks der Branche mit guter Robustheit, Funktionalität, Leistung, Anpassung und Skalierbarkeit. Gleichzeitig bietet es eine sehr einfache API, die unsere Netzwerkprogrammierung erheblich vereinfacht.
Wie der von Java IO eingeführte Artikel implementieren die in diesem Artikel gezeigten Beispiele dieselbe Funktion.
1. Serverseite
Server:
Paket com.Anxpp.io.calculator.netty; importieren io.netty.bootstrap.serverbootstrap; Import IO.NETTY.Channel.Channelfuture; Import IO.NETTY.Channel.Channelinitializer; importieren io.netty.channel.channeloption; Import io.netty.channel.eventloopGroup; import IO.NETTY.Channel.nio.nioEventLoopGroup; import io.netty.channel.socket.socketchannel; importieren io.netty.channel.socket.nio.nioServerSocketchannel; öffentlicher Klassenserver {private int port; öffentlicher Server (int port) {this.port = port; } public void run () löst Ausnahme aus {EventLoopGroup BOSSGroup = new NioeVentLoopGroup (); EventLoopGroup WorkerGroup = new NioeVentLoopGroup (); versuche {serverbootstrap b = new Serverbootstrap (); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.SO_KEEPALIVE, true) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline (). addlast (neuer ServerHandler ()); ChannelFuture f = B.Bind (Port) .Sync (); System.out.println ("Server auf:"+port); f.channel (). closefuture (). sync (); } endlich {WorkerGroup.ShutdownGracefully (); bossGroup.Shutdowngraceduty (); }} public static void main (String [] args) löst eine Ausnahme aus {int port; if (args.length> 0) {port = integer.parseInt (args [0]); } else {port = 9090; } neuer Server (Port) .run (); }}ServerHandler:
Paket com.Anxpp.io.calculator.netty; import IO.NETTY.Buffer.Bytebuf; importieren io.netty.buffer.unpooled; Import IO.NETTY.Channel.ChannelHandlerContext; Import IO.NETTY.Channel.ChannelinBoundHandlerAdapter; importieren java.io.unsupportedenCodingException; import com.anxpp.io.utils.calculator; Public Class ServerHandler erweitert ChannelInBoundHandlerAdapter {@Override public void ChannelRead (ChannelHandlerContext CTX, Object MSG) löscht nicht unterstützte AnscodingException {bytebuf in = (bytebuf) msg; byte [] req = new byte [in.readableBytes ()]; in.readBytes (req); String body = new String (req, "utf-8"); System.out.println ("Client -Nachricht empfangen:"+Körper); String calrresult = null; try {calrresult = rechner.instance.cal (Körper) .ToString (); } catch (Ausnahme e) {calrresult = "Fehlerexpression:" + e.getMessage (); } ctx.write (unpooled.copiedBuffer (calrresult.getBytes ())); } @Override public void ChannelReadComplete (ChannelHandlerContext) löst eine Ausnahme aus {ctx.flush (); } / *** Ausnahmehandling* / @Override public void exceptioncaught (ChannelHandlerContext CTX, Throwable Cause) {cause.printstacktrace (); ctx.close (); }} Paket com.Anxpp.io.calculator.netty; import IO.NETTY.Buffer.Bytebuf; importieren io.netty.buffer.unpooled; Import IO.NETTY.Channel.ChannelHandlerContext; Import IO.NETTY.Channel.ChannelinBoundHandlerAdapter; importieren java.io.unsupportedenCodingException; import com.anxpp.io.utils.calculator; Public Class ServerHandler erweitert ChannelInBoundHandlerAdapter {@Override public void ChannelRead (ChannelHandlerContext CTX, Object MSG) löscht nicht unterstützte AnscodingException {bytebuf in = (bytebuf) msg; byte [] req = new byte [in.readableBytes ()]; in.readBytes (req); String body = new String (req, "utf-8"); System.out.println ("Client -Nachricht empfangen:"+Körper); String calrresult = null; try {calrresult = rechner.instance.cal (Körper) .ToString (); } catch (Ausnahme e) {calrresult = "Fehlerexpression:" + e.getMessage (); } ctx.write (unpooled.copiedBuffer (calrresult.getBytes ())); } @Override public void ChannelReadComplete (ChannelHandlerContext) löst eine Ausnahme aus {ctx.flush (); } / *** Ausnahmehandling* / @Override public void exceptioncaught (ChannelHandlerContext CTX, Throwable Cause) {cause.printstacktrace (); ctx.close (); }} 2. Kunde
Kunde:
Paket com.Anxpp.io.calculator.netty; importieren io.netty.bootstrap.bootstrap; Import IO.NETTY.Channel.Channelfuture; Import IO.NETTY.Channel.Channelinitializer; importieren io.netty.channel.channeloption; Import io.netty.channel.eventloopGroup; import IO.NETTY.Channel.nio.nioEventLoopGroup; import io.netty.channel.socket.socketchannel; importieren io.netty.channel.socket.nio.niosocketchannel; import Java.util.scanner; Public Class Client implementiert Runnable {static ClientHandler Client = new ClientHandler (); public static void main (String [] args) löst Ausnahme aus {neuer Thread (neuer Client ()). start (); @SuppressWarnings ("Ressourcen") Scanner Scanner = neuer Scanner (System.in); while (client.sendmsg (scanner.nextline ())); } @Override public void run () {String host = "127.0.0.1"; int port = 9090; EventLoopGroup WorkerGroup = new NioeVentLoopGroup (); Versuchen Sie {Bootstrap b = neuer Bootstrap (); B.Group (WorkerGroup); B.Channel (Niosocketchannel.Class); B.Option (ChannelOption.so_keepalive, true); B.Handler (neuer ChannelInitializer <Socketchannel> () {@Override public void Initchannel (Socketchannel CH) löst eine Ausnahme aus {ch.pipeline (). AddLast (Client);}}); ChannelelfUture f = B.Connect (Host, Port) .Sync (); f.channel (). closefuture (). sync (); } catch (interruptedException e) {e.printstacktrace (); } endlich {WorkerGroup.ShutdownGracefully (); }}}ClientHandler:
Paket com.Anxpp.io.calculator.netty; import IO.NETTY.Buffer.Bytebuf; importieren io.netty.buffer.unpooled; Import IO.NETTY.Channel.ChannelHandlerContext; Import IO.NETTY.Channel.ChannelinBoundHandlerAdapter; importieren java.io.unsupportedenCodingException; Public Class ClientHandler erweitert ChannelInBoundHandlerAdapter {ChannelHandlerContext CTX; / *** Rufen Sie nach dem TCP -Link -Lebenslauf erfolgreich*/ @Override public void ChannelActive (ChannelHandlerContext CTX) Ausnahme {this.ctx = ctx; } public boolean sendsg (String msg) {System.out.println ("Client sendet eine Nachricht:"+msg); byte [] req = msg.getBytes (); Bytebuf m = unpooled.buffer (req.length); M.Writebytes (Req); ctx.writeAndflush (m); return msg.equals ("q")? Falsch: wahr; } / *** Rufen Sie nach Empfangen der Servermeldung* @throws UnsupportedenCodingException an* / @Override public void ChannelRead (ChannelHandlerContext CTX, Object MSG). byte [] req = new byte [buf.readableBytes ()]; buf.readbytes (req); String body = new String (req, "utf-8"); System.out.println ("Server -Nachricht:"+body); } / *** aufgerufen, wenn eine Ausnahme auftritt ctx.close (); }} 3. Berechnungswerkzeuge
Paket com.Anxpp.io.utils; importieren javax.script.scriptengine; importieren javax.script.scripteniNeManager; importieren javax.script.scriptexception; public enum rechner {Instance; private endgültige statische scriptengine jse = new scriptenGineManager (). GetEnginByName ("JavaScript"); öffentliches Objekt Cal (String Expression) löscht Scriptexception {return jse.eval (Ausdruck); }} 4. Test
Starten Sie den Server und den Client jeweils und geben Sie dann den Ausdruck in der Client -Konsole ein:
1+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5
Sie können die vom Server zurückgegebenen Ergebnisse sehen.
Zeigen Sie die Serverkonsole an:
Der Server ist aktiviert: 9090 empfangene Client Nachricht: 1+5+5+5+5+5 Empfangen Client Meldung: 156158*458918+125615 empfangene Client Nachricht: 1895612+555+5+5+5+5+5+5+5+5+5-5*4/4/4
5. Mehr
Verwandte Artikel:
Java Network IO -Programmierzusammenfassung (Bio, NIO, AIO enthalten alle vollständige Instanzcode)
Die Quellcode-Git-Adresse dieses Beispiels und Java Bio Nio AIO Beispiel: https://github.com/anxpp/java-io.git
Netty verwandte Inhalte werden weiterhin aktualisiert, bis ein einfacher Kommunikationsserver abgeschlossen ist.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.