1 新建实体类,这里需要实现 Serializable 接口即可
import java.io.Serializable;
public class GirlResponse implements Serializable {
private static final long serialVersionUID = -2619994978640439932L;
private int code;
private String msg;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
2 服务端的开发
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.http.HttpObject;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import java.net.InetSocketAddress;
public class Server {
public void bind(int port) throws InterruptedException
{
EventLoopGroup boss=new NioEventLoopGroup();
EventLoopGroup worker=new NioEventLoopGroup();
try
{
ServerBootstrap b=new ServerBootstrap();
b.group(boss,worker)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1280)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>()
{
@Override
protected void initChannel(SocketChannel ch) throws Exception
{
ch.pipeline().addLast(
new ServerHandler()
);
}
});
ChannelFuture f=b.bind(port).sync();
f.channel().closeFuture().sync();
} finally
{
boss.shutdownGracefully();
worker.shutdownGracefully();
}
}
public static void main(String[] args) throws InterruptedException
{
int port = 8006;
new Server().bind(port);
}
}
2.1 服务端服务处理
import com.fasterxml.jackson.core.io.CharTypes;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class ServerHandler extends ChannelInboundHandlerAdapter
{
@Override
public void channelRead(ChannelHandlerContext ctx , Object msg) throws Exception
{
UserInfo user= (UserInfo) msg;
System.out.println("收到:"+user);
ctx.writeAndFlush(reply(user));
}
private static GirlResponse reply(UserInfo user){
GirlResponse gr=new GirlResponse();
gr.setMsg("to "+user.getName()+" : 测试");
return gr;
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx , Throwable cause) throws Exception
{
cause.printStackTrace();
ctx.close();
}
}
3 客户端
import io.netty.bootstrap.Bootstrap;
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.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.http.HttpObject;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
public class Client {
public void connect(int port, String host) throws InterruptedException
{
EventLoopGroup group = new NioEventLoopGroup();
try
{
Bootstrap b=new Bootstrap();
b.group(group)
.option(ChannelOption.TCP_NODELAY, true)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>()
{
@Override
protected void initChannel(SocketChannel ch) throws Exception
{
ch.pipeline().addLast(new ClientHandler());
}
});
ChannelFuture f= b.connect(host, port).sync();
f.channel().closeFuture().sync();
} finally
{
group.shutdownGracefully();
}
}
public static void main(String[] args) throws InterruptedException
{
int port = 8006;
String host="127.0.0.1";
new Client().connect(port, host);
}
}
3.1 客户端实现类
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import java.util.Random;
public class ClientHandler extends ChannelInboundHandlerAdapter {
public void channelActive(ChannelHandlerContext ctx) throws Exception
{
System.out.println("同学测试:");
Random r = new Random();
for (int i = 1; i <= 5; i++)
{
UserInfo user = new UserInfo();
user.setName("同学 " + i);
user.setHeight(r.nextInt(25) + 160);
ctx.write(user);
System.out.println(user);
}
ctx.flush();
}
public void channelRead(ChannelHandlerContext ctx , Object msg) throws Exception
{
GirlResponse gr= (GirlResponse) msg;
System.out.println("收到测试回复 :"+gr.getMsg());
}
public void exceptionCaught(ChannelHandlerContext ctx , Throwable cause) throws Exception
{
cause.printStackTrace();
ctx.close();
}
}
4运行结果
同学测试:
[name=同学 1, height=182]
[name=同学 2, height=165]
[name=同学 3, height=173]
[name=同学 4, height=163]
[name=同学 5, height=177]