既然学了netty自然需要实验下,自然自己就简单实验下。
这个是简版的,所以比较粗糙。
package study.netty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public class EchoServer {
private static final Logger LOGGER = LoggerFactory.getLogger(EchoServer.class);
private int port;
public EchoServer(int port) {
this.port = port;
}
public static void main(String... args) {
EchoServer echoServer = new EchoServer(12345);
echoServer.start();
}
public void start() {
NioEventLoopGroup bossGroup = new NioEventLoopGroup(),
workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.localAddress(port)
.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new EchoServerHandler());
}
});
ChannelFuture f = bootstrap.bind().sync();
System.out.println(EchoServer.class.getName() + " started and listen on " + f.channel().localAddress());
f.channel().closeFuture().sync();
} catch (InterruptedException e) {
LOGGER.error(e.getMessage());
} finally {
try {
workerGroup.shutdownGracefully().sync();
bossGroup.shutdownGracefully().sync();
} catch (InterruptedException e) {
LOGGER.error(e.getMessage());
}
}
}
}
不过没其他原因的话,最好还是用SimpleChannelInboundHandler吧,毕竟池化的bytebuf虽然性能好,但是自己手动维护难免错误。
package study.netty;
import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
private static final Logger LOGGER = LoggerFactory.getLogger(EchoServerHandler.class);
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf byteBuf = (ByteBuf) msg;
LOGGER.info("echo server receive msg:{}", byteBuf.toString(StandardCharsets.UTF_8));
ctx.write(msg);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
package study.netty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
public class EchoClient {
private final Logger logger = LoggerFactory.getLogger(getClass());
private static String host = "127.0.0.1";
private static int port = 12345;
public static void main(String[] args) {
EchoClient client = new EchoClient();
client.start();
}
public void start() {
NioEventLoopGroup nelg = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(nelg)
.channel(NioSocketChannel.class)
.remoteAddress(host, port)
.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new EchoClientHandler());
}
});
ChannelFuture future = bootstrap.connect().sync();
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
nelg.shutdownGracefully().sync();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package study.netty;
import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(Unpooled.copiedBuffer("client short msg", StandardCharsets.UTF_8));
}
@Override
public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
logger.info("client received:{}", msg.toString(StandardCharsets.UTF_8));
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.error(cause.getMessage());
ctx.close();
}
}
分享到:
相关推荐
Netty4EchoDemo是一个基于Netty 4框架实现的简单回显客户端(echo client)和服务器(echo server)示例。这个项目适用于那些想要学习如何使用Netty进行网络编程的开发者,尤其是对Java NIO(非阻塞I/O)感兴趣的...
在这个"Netty_Chat_server_client_src_java.zip"压缩包中,包含了一个基于Netty实现的简单聊天应用的源代码,分为服务器(server)和客户端(client)两部分。 首先,我们来看"server"部分。Netty服务器端通常由多个...
使用:先运行UserServer,在运行UserClient。成功连接后,服务器发送一个User对象给客户端。输出到客户端控制台 5.第四个示例 com.user_1 Netty将java对象作为数据的发送与接收升级版。将数据的预处理模块化提炼...
- **回声服务 (Echo Server):**该示例展示了如何创建一个服务器端程序,它接收到客户端发送的数据后原样返回。 - **时间服务 (Time Server):**此示例更进一步,服务器不仅接收数据,还会根据客户端请求发送当前...
- **Echo Server**:与丢弃服务器不同,回声服务器会将接收到的数据原样返回给客户端。 - **Time Server**:时间服务器接收客户端请求后返回当前的时间戳。 - **Time Client**:与时间服务器配对使用的客户端程序,...
2. 快速启动:通过编写一个简单的Echo Server和Client,展示Netty的基本使用,包括Bootstrap、ServerBootstrap、Channel、Handler等关键概念。 3. 事件驱动模型:解释Netty的NIO(非阻塞I/O)事件模型,包括...
# Netty 实战 第二章节 ...echo server \ client by netty nio socket ``` # 启动 ``` server 端启动设置 端口 java -jar xxx.jar 9090 client 端启动设置 目标地址 目标端口 java -jar xxx.jar localhost 9090 ```
在实际应用中,`java-netty-master` 可能包含了简单的服务器和客户端示例,如 Echo Server(服务器接收并回显客户端发送的数据)和 Time Client(客户端向服务器请求当前时间)。通过这些例子,你可以学习如何配置 ...
3. **时间服务器与客户端**(Writing a Time Server and Client):实现一个 TCP 服务器与客户端,服务器端接收请求并返回当前时间。 4. **处理流式传输**(Dealing with a Stream-based Transport):针对 TCP 连接...
解决方案: “ J-Reactive-8583” ISO8583客户端和服务器基于进行编码/解码, 出色的异步消息传递框架构建。 它根据Apache License 2.0分发。 支持的功能 客户端和服务器端点。 Java 11+ 使用库支持ISO8583消息。 ...
在Android Echo Client UDP项目中,我们可能找到了以下组件和概念: 1. **DatagramSocket**:UDP通信的核心组件,它用于发送和接收数据报(datagrams)。在这个客户端中,DatagramSocket创建并配置以连接到服务器的...
在"DotNetty_Test.rar"这个压缩包中,包含了两个关键的文件:Echo.Server和Echo.Client,这显然是一个简单的回显服务示例,展示了如何使用DotNetty进行客户端和服务端之间的通信。 首先,让我们深入了解一下...
在Java中,实现SOCKJS客户端的库通常是基于Netty框架的“sockjs-client-java”,这个库允许Java开发者轻松地创建和管理SOCKJS连接。"SOCKJS-JAVA-master"这个压缩包文件很可能是这个库的源代码仓库,包含了项目的主...
通过对《Java经典编程100例》中的两个例子——Server端编程和Client端编程的详细介绍,我们不仅了解了Java网络编程的基本原理和技术要点,还掌握了如何使用Java编写简单的服务器端和客户端程序的方法。这对于初学者...
server/client ##数据结构与算法 ####动态规划 CUT: 分隔钢筋 LCS: 最长公共子序列 LIS: 最长递增子序列 MaxLength: 无环有向图最长加权路径 LPS: 最长回文子序列 Knapspack: 01背包问题 ####贪心算法 ActiveSelect:...
在源码中,`ios_echo_client_udp`很可能是一个简单的UDP回显客户端,它向服务器发送一个数据包,然后等待服务器回传相同的数据。这是测试网络连接和延迟的一个常见做法。客户端发送一个消息,服务器接收到后立即原样...