}
}).start();
}
private class Server {
private final int SERVER_PORT = 9000;
public Server() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup).option(ChannelOption.SO_KEEPALIVE, true).channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 128).handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel sc) throws Exception {
sc.pipeline().addLast(new JsonObjectDecoder());//JSon解码器。
sc.pipeline().addLast(new StringEncoder());// 发送字符串的编码器。
sc.pipeline().addLast(new StringDecoder());// 接收到字符串的解码器。
sc.pipeline().addLast(new MyChannelHandlerAdapter());
}
});
// 绑定端口,开始接收进来的连接。
ChannelFuture cf = b.bind(SERVER_PORT).sync();
// 等待服务器关闭Socket。
cf.channel().closeFuture().sync();
}
private class MyChannelHandlerAdapter extends ChannelHandlerAdapter {
private final Logger logger = Logger.getLogger(MyChannelHandlerAdapter.class.getName());
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println(“连接激活”);
ctx.writeAndFlush(“hello,world!”); // 若没有StringEncoder,则发送不出去字符串。
System.out.println(“写入完成”);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//ByteBuf buf = (ByteBuf) msg;
logger.info(msg.toString());
//System.out.println(buf.toString(CharsetUtil.UTF_8));
//logger.info(msg.toString());
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
logger.info(“channelReadComplete”);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.log(Level.WARNING, “发生错误,关闭链接。”, cause);
ctx.close();
}
}
}
}
运行在PC电脑上的客户端,不停的发送字符串数据(转换成byte字节)。
import java.io.DataOutputStream;
import java.net.Socket;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import com.google.gson.Gson;
public class Client {
public Client() throws Exception {
Socket socket = new Socket(“localhost”, 6000);
System.out.println(“连接建立:” + socket.toString());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
Date date = new Date(System.currentTimeMillis());
DateFormat dateFormat = new SimpleDateFormat(“MM-dd,HH:ss:SSS”);
Message message = new Message();
Gson gson = new Gson();
System.out.println(“开始循环发一万次ping…”);
for (int i = 0; i < 10000; i++) {
date.setTime(System.currentTimeMillis());
message.time = dateFormat.format(date);
String jsonString = gson.toJson(message);
System.out.println(jsonString);
dos.write(jsonString.getBytes(“UTF-8”));
dos.flush();
Thread.sleep(1000);
}
System.out.println(“循环一万次发ping结束”);
socket.close();
}
public static void main(String[] args) {
try {
new Client();
} catch (Exception e) {
e.printStackTrace();
}
}
最后:学习总结——Android框架体系架构知识脑图(纯手绘xmind文档)
学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。
下方即为我手绘的Android框架体系架构知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的Android框架体系架构知识脑图原件(包括上方的面试解析xmind文档)
除此之外,前文所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!
——感谢大家伙的认可支持,请注意:点赞+点赞+点赞!!!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
0BuQ-1715583909683)]
除此之外,前文所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!
——感谢大家伙的认可支持,请注意:点赞+点赞+点赞!!!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!