AbstractClientAbstractClient是对客户端的抽象,同样它的继承和AbstractServer也一样 , 只是在实现不同而已,接下来我们来看看AbstractClient的实现,该类内部有4个关键的字段,对于executor和executorRepository这两个字段与AbstractServer功能类似,这里重点来介绍connectLock和needReconnect,connectLock是当客户端进行连接、断开、重连等操作时,需要获取该锁进行同步操作,needReconnect 在客户端发送数据之前,会检查客户端的连接是否断开,如果断开了,则会根据needReconnect字段,决定是否重连 。AbstractClient整体的初始化是在构造函数实现的 , 我们可以看到AbstractClient 定义了 doOpen、doClose、doConnect和doDisConnect四个抽象方法给子类实现,整体的设计与AbstractServer类似 。
public AbstractClient(URL url, ChannelHandler handler) throws RemotingException { //调用父类构造方法 super(url, handler); //从URL获取是否重连字段 默认是 needReconnect = url.getParameter(Constants.SEND_RECONNECT_KEY, true); //初始化Executor initExecutor(url); try { //初始化具体的底层实现client doOpen(); } catch (Throwable t) { //关闭 close(); throw new RemotingException(url.toInetSocketAddress(), null, "Failed to start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress() + " connect to the server " + getRemoteAddress() + ", cause: " + t.getMessage(), t); } try { //创建连接 connect(); if (logger.isInfoEnabled()) { logger.info("Start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress() + " connect to the server " + getRemoteAddress()); } } catch (RemotingException t) { if (url.getParameter(Constants.CHECK_KEY, true)) { close(); throw t; } else { logger.warn("Failed to start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress() + " connect to the server " + getRemoteAddress() + " (check == false, ignore and retry later!), cause: " + t.getMessage(), t); } } catch (Throwable t) { close(); throw new RemotingException(url.toInetSocketAddress(), null, "Failed to start " + getClass().getSimpleName() + " " + NetUtils.getLocalAddress() + " connect to the server " + getRemoteAddress() + ", cause: " + t.getMessage(), t); } }
推荐阅读
- 驱动开发:内核封装WSK网络通信接口
- 二 Linux进程间通信
- 一 Linux进程间通信
- VS Code For Web 深入浅出 -- 进程间通信篇
- 聊聊Linux中CPU上下文切换
- 聊聊Vim的工作原理
- 驱动开发:通过Async反向与内核通信
- 今天聊聊跑步配速那些事 跑步机配速对照表
- 51单片机下实现软件模拟IIC通信
- 驱动通信:通过PIPE管道与内核层通信