Netty搭建Socket服务器(第一天学习)

为什么要学习netty

    当你写了一段时间的客户端以后你会发现除非你想写opengl或者提别的复杂的图形算法,否则你不得不承认你只会写一些逻辑的显示,至于那些现在流行的,高并发,大数据,人工智能就会越来越远,于是我准备学习高并发的相关知识,顺便也可以总结一下以前学习的c的linux网络编程的一些基础知识。参考书(netty实战)

第一天学习的代码

    我这里的代码是jdk1.8

    使用工具Eclipse

    使用的netty-all-4.0.56.Final 这个版本

主类Hello_Server

package demo1;

import io.netty.bootstrap.ServerBootstrap;//服务器线程
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class Hello_Server {
	private static final int portNumber = 7878;//端口
	public static void main(String[] args) throws InterruptedException{
		// TODO Auto-generated method stub
		EventLoopGroup bossGroup = new NioEventLoopGroup();//主线程
		EventLoopGroup workGroup = new NioEventLoopGroup();//工作线程
		try
		{
			System.out.print("服务器已经启动");
			ServerBootstrap b = new ServerBootstrap();
			b.group(bossGroup,workGroup);//装入线程
			b.channel(NioServerSocketChannel.class);//制定Nio传输
			b.childHandler(new HelloServerInitializer());//添加到子channel的ChannelPipeline里面
			ChannelFuture f = b.bind(portNumber).sync();//绑定端口
			
			f.channel().closeFuture().sync();//关闭
		}
		finally {
			bossGroup.shutdownGracefully();//关闭线程
			workGroup.shutdownGracefully();
		}
	}
}

对应的pipeline绑定事件类

HelloServerInitializer.java

package demo1;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class HelloServerInitializer extends ChannelInitializer {
	//初始化对的一些操作
	@Override
	protected void initChannel(SocketChannel ch) throws Exception
	{
		ChannelPipeline pipeline = ch.pipeline();//获得连接
		//解析方式以\n作为标记
		pipeline.addLast("framer",new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
		pipeline.addLast("decoder",new StringDecoder());
		pipeline.addLast("encode",new StringEncoder());
		//自己的逻辑
		pipeline.addLast("handler",new HelloServerHandler());
	}
}

处理我自己逻辑的类

HelloServerHandler.java

package demo1;

import java.net.InetAddress;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class HelloServerHandler extends SimpleChannelInboundHandler {
	//收到数据
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg)
            throws Exception {
        //ChannelHandlerContext 返回事件的对象
        // 收到消息直接打印输出
        System.out.println(ctx.channel().remoteAddress() + " Say : " + msg);

        // 返回客户端消息 - 我已经接收到了你的消息
        ctx.writeAndFlush("Received your message !");
    }
    
    
    /*
     * 如果连接错误事件
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    	// TODO Auto-generated method stub
    	cause.printStackTrace();
    	ctx.close();
    }
    

    /*
     * 覆盖 channelActive 方法 在channel被启用的时候触发 (在建立连接的时候)
     * channelActive 和 channelInActive 在后面的内容中讲述,这里先不做详细的描述
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("RamoteAddress : " + ctx.channel().remoteAddress()
                + " active !");
        ctx.writeAndFlush("Welcome to "
                + InetAddress.getLocalHost().getHostName() + " service!\n");
        super.channelActive(ctx);
    }
}

使用dos命令telnet 127.0.0.1 7878来做连接测试如果成功如图所示

Netty搭建Socket服务器(第一天学习)_第1张图片

这说明我的初级服务器已经连接成功!当然还有不完善的地方比如不能发送中文。

你可能感兴趣的:(Netty)