java netty实现tcp协议_Netty实现网络通信

本文介绍了如何利用Java的Netty框架搭建一个简单的TCP聊天服务器和客户端。Netty简化了网络应用程序的开发,包括TCP和UDP的socket服务。通过创建`SimpleChatServerHandler`处理网络事件,如客户端连接、断开、读取信息等,并在`SimpleChatServerInitializer`中配置ChannelPipeline。客户端处理类`SimpleChatClientHandler`负责接收并打印信息。通过运行服务器和多个客户端,可以进行实时聊天交互。
摘要由CSDN通过智能技术生成

Netty 是一个 Java NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。更多关于 Netty 的知识,可以参阅《Netty 4.x 用户指南》( https://github.com/waylau/netty-4-user-guide)

下面,就基于 Netty 快速实现一个聊天小程序。

准备

JDK 7+

Maven 3.2.x

Netty 4.x

Eclipse 4.x

服务端

让我们从 handler (处理器)的实现开始,handler 是由 Netty 生成用来处理 I/O 事件的。

SimpleChatServerHandler.java

public class SimpleChatServerHandler extends SimpleChannelInboundHandler { // (1)

public static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

@Override

public void handlerAdded(ChannelHandlerContext ctx) throws Exception { // (2)

Channel incoming = ctx.channel();

for (Channel channel : channels) {

channel.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " 加入\n");

}

channels.add(ctx.channel());

}

@Override

public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { // (3)

Channel incoming = ctx.channel();

for (Channel channel : channels) {

channel.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " 离开\n");

}

channels.remove(ctx.channel());

}

@Override

protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception { // (4)

Channel incoming = ctx.channel();

for (Channel channel : channels) {

if (channel != incoming){

channel.writeAndFlush("[" + incoming.remoteAddress() + "]" + s + "\n");

} else {

channel.writeAndFlush("[you]" + s + "\n");

}

}

}

@Override

public void channelActive(ChannelHandlerContext ctx) throws Exception { // (5)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Netty 是一款高性能、异步事件驱动的网络框架,主要设计用于简化网络服务器和客户端的编程,并且能够处理高并发连接。它基于 NIO(非阻塞 I/O)技术,利用多路复用(例如 Selector)实现了对单个线程高效地管理大量并发连接的能力。Netty 框架提供了一系列高级功能,包括缓冲区管理和协议编码/解码(Codec),使得开发者可以专注于业务逻辑而无需过多关注底层网络细节。 ### Java Netty 实现 TCP 通信的基本步骤: #### 1. **构建项目** - 创建一个新的 Java 项目,在 Maven 或 Gradle 中添加相应的依赖库 `netty-all` 和 `netty-tcnative-full`。 #### 2. **配置服务端** - 定义一个服务端 `ServerBootstrap` 类型的对象,用于初始化服务端实例并绑定到特定的 IP 地址和端口。 - 使用 `ChannelPipelineFactory` 配置管道,这通常包含了接收数据、处理数据以及发送响应的过程。 - 设置必要的处理器,如 `ServerSocketChannelHandler` 负责接收新连接请求,然后创建新的 `Channel` 对象。 - 启动服务端,监听指定端口并开始接受连接。 ```java public class MyServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // 添加你的处理器链在这里,比如定义的自定义编码器Decoder和解码器Encoder等 p.addLast(new YourCustomDecoder()); p.addLast(new YourCustomEncoder()); p.addLast("handler", new MyServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 100) .childOption(ChannelOption.SO_KEEPALIVE, true); b.bind(8080).sync().channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); } } } ``` #### 3. **配置客户端** - 定义一个客户端类,使用 `ClientBootstrap` 初始化客户端实例。 - 设置 `ChannelFutureListener` 来处理连接状态的变化。 - 发送数据到服务器并读取服务器返回的数据。 ```java public class MyClient { private final String host; private final int port; public MyClient(String host, int port) { this.host = host; this.port = port; } public void connect() throws Exception { EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ClientBootstrap b = new ClientBootstrap(); b.group(workerGroup); b.channel(NioSocketChannel.class); b.option(ChannelOption.SO_KEEPALIVE, true); b.handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // 添加你的处理器链,比如定义的自定义编码器Decoder和解码器Encoder等 p.addLast(new YourCustomDecoder()); p.addLast(new YourCustomEncoder()); p.addLast("handler", new MyClientHandler()); } }); SocketAddress remoteAddress = new InetSocketAddress(host, port); ChannelFuture f = b.connect(remoteAddress); f.syncUninterruptibly(); // 等待连接完成 // 如果需要,从这里开始发送数据和接收响应的操作 } finally { workerGroup.shutdownGracefully(); } } } ``` #### 4. **处理数据和异常** - 编写自定义的编码器和解码器,以及处理异常的逻辑。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值