Saya menulis sebuah artikel sebelumnya: Java Network IO Ringkasan Pemrograman (Bio, NIO, dan AIO semuanya berisi kode instance lengkap), yang memperkenalkan cara menggunakan dukungan IO asli Java untuk pemrograman jaringan. Artikel ini memperkenalkan metode yang lebih sederhana, yaitu Java Nio Framework.
Netty adalah salah satu kerangka kerja NIO paling populer di industri ini, dengan ketahanan, fungsionalitas, kinerja, kustomisasi, dan skalabilitas yang baik. Pada saat yang sama, ini menyediakan API yang sangat sederhana yang sangat menyederhanakan pemrograman jaringan kami.
Seperti artikel yang diperkenalkan oleh Java IO, contoh -contoh yang ditunjukkan dalam artikel ini mengimplementasikan fungsi yang sama.
1. Sisi server
Server:
paket com.anxpp.io.calculator.netty; impor io.netty.bootstrap.serverbootstrap; impor io.netty.channel.channelfuture; impor io.netty.channel.channelinitializer; impor io.netty.channel.channeloption; impor io.netty.channel.eventloopgroup; impor io.netty.channel.nio.nioeventloopGroup; impor io.netty.channel.socket.socketchannel; impor io.netty.channel.socket.nio.nioserversocketchannel; server kelas publik {private int port; server publik (port int) {this.port = port; } public void run () melempar Exception {EventLoopGroup bossgroup = new nioeventloopGroup (); EventLoopGroup workergroup = new nioeventloopgroup (); coba {serverbootstrap b = serverbootstrap baru (); 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 (serverhandler baru ()); Channelfuture f = b.bind (port) .sync (); System.out.println ("Server on:"+port); f.channel (). CloseFuture (). Sync (); } akhirnya {workergroup.shutdowngracelly (); bossgroup.shutdowngracelly (); }} public static void main (string [] args) melempar Exception {int port; if (args.length> 0) {port = integer.parseint (args [0]); } else {port = 9090; } server baru (port) .run (); }}ServerHandler:
paket com.anxpp.io.calculator.netty; impor io.netty.buffer.bytebuf; impor io.netty.buffer.unpooled; impor io.netty.channel.ChannelHandlerContext; impor io.netty.channel.channelinboundhandlerapter; impor java.io.unsupportedencodingException; impor com.anxpp.io.utils.calculator; ServerHandler kelas publik memperluas channelInboundHandLerapter {@Override public void channelRead (channelHandlerContext CTX, objek msg) melempar unsportedencodingException {bytebuf in = (bytebuf) msg; byte [] req = byte baru [in.readableBytes ()]; in.readbytes (req); String body = string baru (req, "UTF-8"); System.out.println ("Pesan Klien Diterima:"+Body); String calrResult = null; coba {calrResult = calculator.instance.cal (body) .toString (); } catch (Exception e) {calrResult = "Ekspresi kesalahan:" + e.getMessage (); } ctx.write (unpooled.copiedbuffer (calrresult.getbytes ())); } @Override public void channelReadComplete (ChannelHandlerContext CTX) melempar Exception {ctx.flush (); } / *** Penanganan Pengecualian* / @Override public void exceptionCaught (ChannelHandlerContext CTX, Throwable Cause) {cause.printstacktrace (); ctx.close (); }} paket com.anxpp.io.calculator.netty; impor io.netty.buffer.bytebuf; impor io.netty.buffer.unpooled; impor io.netty.channel.ChannelHandlerContext; impor io.netty.channel.channelinboundhandlerapter; impor java.io.unsupportedencodingException; impor com.anxpp.io.utils.calculator; ServerHandler kelas publik memperluas channelInboundHandLerapter {@Override public void channelRead (channelHandlerContext CTX, objek msg) melempar unsportedencodingException {bytebuf in = (bytebuf) msg; byte [] req = byte baru [in.readableBytes ()]; in.readbytes (req); String body = string baru (req, "UTF-8"); System.out.println ("Pesan Klien Diterima:"+Body); String calrResult = null; coba {calrResult = calculator.instance.cal (body) .toString (); } catch (Exception e) {calrResult = "Ekspresi kesalahan:" + e.getMessage (); } ctx.write (unpooled.copiedbuffer (calrresult.getbytes ())); } @Override public void channelReadComplete (ChannelHandlerContext CTX) melempar Exception {ctx.flush (); } / *** Penanganan Pengecualian* / @Override public void exceptionCaught (ChannelHandlerContext CTX, Throwable Cause) {cause.printstacktrace (); ctx.close (); }} 2. Klien
Klien:
paket com.anxpp.io.calculator.netty; impor io.netty.bootstrap.bootstrap; impor io.netty.channel.channelfuture; impor io.netty.channel.channelinitializer; impor io.netty.channel.channeloption; impor io.netty.channel.eventloopgroup; impor io.netty.channel.nio.nioeventloopGroup; impor io.netty.channel.socket.socketchannel; impor io.netty.channel.socket.nio.niosocketchannel; impor java.util.scanner; klien kelas publik mengimplementasikan runnable {static clientHandler client = new clientHandler (); public static void main (string [] args) melempar pengecualian {utas baru (klien baru ()). start (); @SuppressWarnings ("Resource") Scanner Scanner = Pemindai Baru (System.in); while (client.sendmsg (scanner.nextline ())); } @Override public void run () {string host = "127.0.0.1"; int port = 9090; EventLoopGroup workergroup = new nioeventloopgroup (); coba {bootstrap b = bootstrap baru (); B.Group (WorkerGroup); b.channel (niosocketchannel.class); b.option (channeloption.so_keepalive, true); B.Handler (ChannelInitializer baru <Socketchannel> () {@Override public void initchannel (socketchannel ch) melempar pengecualian {ch.pipeline (). addLast (klien);}}); Channelfuture f = b.connect (host, port) .sync (); f.channel (). CloseFuture (). Sync (); } catch (InterruptedException e) {E.PrintStackTrace (); } akhirnya {workergroup.shutdowngracelly (); }}}ClientHandler:
paket com.anxpp.io.calculator.netty; impor io.netty.buffer.bytebuf; impor io.netty.buffer.unpooled; impor io.netty.channel.ChannelHandlerContext; impor io.netty.channel.channelinboundhandlerapter; impor java.io.unsupportedencodingException; kelas publik ClientHandler memperluas channelInboundHandLerapter {ChannelHandlerContext CTX; / *** Dipanggil setelah resume tautan TCP berhasil*/ @Override public void channelActive (ChannelHandlerContext CTX) melempar Exception {this.ctx = ctx; } public boolean sendmsg (string msg) {System.out.println ("Klien mengirim pesan:"+msg); byte [] req = msg.getbytes (); Bytebuf m = unpooled.buffer (req.length); m.writebytes (req); CTX.WriteAndFlush (M); return msg.equals ("q")? false: true; } / *** dipanggil setelah menerima pesan server* @throws UnsupportedEncodingException* / @Override void channelRead (ChannelHandlerContext CTX, Object Msg) melempar UnsupportedEncodingException {bytebuf buf = (bytebuf) msg; byte [] req = byte baru [buf.readableBytes ()]; buf.readbytes (req); String body = string baru (req, "UTF-8"); System.out.println ("Pesan Server:"+Body); } / *** Dipanggil saat pengecualian terjadi* / @Override void public exceptionCaught (ChannelHandlerContext CTX, Throwable Cause) {cause.printStackTrace (); ctx.close (); }} 3. Alat untuk Perhitungan
Paket com.anxpp.io.utils; import javax.script.scriptengine; import javax.script.scriptenginemanager; import javax.script.scriptException; kalkulator enum publik {instance; private final static scriptEngine jse = new ScriptEngineManager (). getenginebyname ("javascript"); Objek Publik Cal (Ekspresi String) melempar ScriptException {return jse.eval (ekspresi); }} 4. Tes
Mulai masing -masing server dan klien, dan kemudian masukkan ekspresi pada konsol klien:
1+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5*4/4/4/4/4/5/5/5/5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5-5*4/4/4
Anda dapat melihat hasilnya dikembalikan oleh server.
Lihat konsol server:
Server diaktifkan: 9090 Pesan Klien yang Diterima: 1+5+5+5+5+5 Pesan Klien Diterima: 156158*458918+125615 Pesan Klien yang Diterima: 1895612+555+5+5+5+5+5+5+5+5+5-5*4/4
5. lebih
Artikel terkait:
JAVA JARINGAN IO Ringkasan Pemrograman (Bio, NIO, AIO semuanya berisi kode instance lengkap)
Alamat Kode Sumber GIT dari contoh ini dan Java Bio Nio AIO Contoh: https://github.com/anxpp/java-io.git
Konten terkait Netty akan terus diperbarui sampai server komunikasi sederhana selesai.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.