- 一、基于IO的java网络程序
- 二、基于NIO的java网络程序
- 三、基于Netty的java网络程序
- 四、总结
- 参考链接
IO、NIO、Netty简单了解 一、基于IO的java网络程序
- 使用IDEA创建服务端程序(新建java工程)
package com.company; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Main { public static void main(String[] args) throws IOException { //创建客户端的Socket对象(SevereSocket) //ServerSocket (int port)创建绑定到指定端口的服务器套接字 ServerSocket ss=new ServerSocket(50000); //Socket accept()侦听要连接到此套接字并接受他 Socket s=ss.accept(); //获取输入流,读数据,并把数据显示在控制台 InputStream is=s.getInputStream(); byte[] bys=new byte[1024]; int len=is.read(bys); String data=new String(bys,0,len); System.out.println("数据是:"+data); //释放资源 s.close(); ss.close(); } }
- 使用IDEA创建客户端端程序(新建java工程)
package com.company; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class Main { public static void main(String[] args) throws IOException{ //创建客户端的Socket对象 Socket s=new Socket("127.0.0.1", 50000); //获取输出流,写数据 OutputStream os=s.getOutputStream(); os.write("hello,物联网19级".getBytes()); //释放资源 s.close(); } }
- 依次运行服务器和客户端代码
- 使用IDEA创建服务端程序(新建java工程)
import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; public class Server { //网络通信IO *** 作,TCP协议,针对面向流的监听套接字的可选择通道(一般用于服务端) private ServerSocketChannel serverSocketChannel; private Selector selector; public void start(Integer port) throws Exception { serverSocketChannel = ServerSocketChannel.open(); selector = Selector.open(); //绑定监听端口 serverSocketChannel.socket().bind(new InetSocketAddress(port)); //设置为非阻塞模式 serverSocketChannel.configureBlocking(false); //注册到Selector上 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); startListener(); } private void startListener() throws Exception { while (true) { // 如果客户端有请求select的方法返回值将不为零 if (selector.select(1000) == 0) { System.out.println("当前没有任务!!!"); continue; } // 如果有事件集合中就存在对应通道的key SetselectionKeys = selector.selectedKeys(); Iterator iterator = selectionKeys.iterator(); // 遍历所有的key找到其中事件类型为Accept的key while (iterator.hasNext()) { SelectionKey key = iterator.next(); if (key.isAcceptable()) handleConnection(); if (key.isReadable()) handleMsg(key); iterator.remove(); } } } private void handleConnection() throws Exception { SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024)); } private void handleMsg(SelectionKey key) throws Exception { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer attachment = (ByteBuffer) key.attachment(); channel.read(attachment); System.out.println("当前信息: " + new String(attachment.array())); } public static void main(String[] args) throws Exception { Server myServer = new Server(); myServer.start(8887); } }
- 使用IDEA创建客户端程序(新建java工程)
import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; public class Click { public static void main(String[] args) throws Exception { SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); // 连接服务器 if (!socketChannel.connect(new InetSocketAddress("127.0.0.1", 8887))) { while (!socketChannel.finishConnect()) { System.out.println("connecting..."); } } //发送数据 String str = "hello,物联网19级"; ByteBuffer byteBuffer = ByteBuffer.wrap(str.getBytes()); socketChannel.write(byteBuffer); System.in.read(); } }
- 依次运行
- 使用IDEA创建服务端和客户端程序(新建java工程),导入包,两个项目都要导入,FIle->Project Structure
- 下载netty的jar包
搜索输入io.netty:netty-all,等待一下,时间可能有几分钟,记得勾上Download to - 服务端程序
import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import java.net.InetSocketAddress; public class Server { private int port; public static void main(String[] args){ new Server(12345).start(); } public Server(int port) { this.port = port; } public void start() { EventLoopGroup boss = new NioEventLoopGroup(1); EventLoopGroup work = new NioEventLoopGroup(); try { ServerBootstrap server = new ServerBootstrap() .group(boss, work).channel(NioServerSocketChannel.class) .localAddress(new InetSocketAddress(port)) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline() .addLast("decoder", new StringDecoder()) .addLast("encoder", new StringEncoder()) .addLast(new HelloWorldServerHandler()); } }); //绑定端口 ChannelFuture future = server.bind().sync(); System.out.println("server started and listen " + port); future.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); }finally { boss.shutdownGracefully(); work.shutdownGracefully(); } } public static class HelloWorldServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("HelloWorldServerHandler active"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("server channelRead.."); System.out.println(ctx.channel().remoteAddress()+"->Server :"+ msg.toString()); ctx.write("server write"+msg); ctx.flush(); } } }
- 客户端程序
import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; public class Client { private static final String HOST = "localhost"; private static final int PORT= 12345; public static void main(String[] args){ new Client().start(HOST, PORT); } public void start(String host, int port) { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap client = new Bootstrap().group(group).channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline() .addLast("decoder", new StringDecoder()) .addLast("encoder", new StringEncoder()) .addLast(new HelloWorldClientHandler()); } }); ChannelFuture future = client.connect(host, port).sync(); future.channel().writeAndFlush("Hello Netty Server ,I am a netty client"); future.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } finally { group.shutdownGracefully(); } } public static class HelloWorldClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("HelloWorldClientHandler Active"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("HelloWorldClientHandler read Message:"+msg); } } }
- 依次运行
本次实验学习了IO、NIO、Netty三者的原理和特点,三种编程方式性能方面,NIO优于IO。
参考链接
https://blog.csdn.net/qq_45659777/article/details/121730888
https://blog.csdn.net/m0_49297422/article/details/121939502
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)