设为首页 加入收藏

TOP

分布式数据库中间件?(2)Cobar与客户端的握手认证(一)
2014-11-23 23:25:56 来源: 作者: 【 】 浏览:27
Tags:分布式 数据库 中间件 Cobar 客户端 握手 认证

Cobar启动完成,监听特定端口。整个认证的流程图:

\

NIOAcceptor类继承自Thread类,该类的对象会以线程的方式运行,进行连接的监听。

NIOAcceptor启动的初始化过程如下:

1 、打开一个selector,获取一个ServerSocketChannel对象,对该对象的socket绑定特定的监听端口,并设置该channel为非阻塞模式,然后想selector注册该channel,绑定感兴趣的事件位OP_ACCEPT。

01 public NIOAcceptor(String name, int port, FrontendConnectionFactory factory) throws IOException {
02 super.setName(name);
03 this.port = port;
04 this.selector = Selector.open();
05 this.serverChannel = ServerSocketChannel.open();
06 //ServerSocket使用TCP
07 this.serverChannel.socket().bind(new InetSocketAddress(port));
08 this.serverChannel.configureBlocking(false);
09 this.serverChannel.register(selector, SelectionKey.OP_ACCEPT);
10 this.factory = factory;
11 }

2、 然后会启动该线程,线程的run函数如下:

01 public void run() {
02 final Selector selector = this.selector;
03 //线程一直循环
04 for (;;) {
05 ++acceptCount;
06 try {
07 selector.select(1000L);
08 Set keys = selector.selectedKeys();
09 try {
10 for (SelectionKey key : keys) {
11 if (key.isValid() && key.isAcceptable()) {
12 //接受来自客户端的连接
13 accept();
14 } else {
15 key.cancel();
16 }
17 }
18 } finally {
19 keys.clear();
20 }
21 } catch (Throwable e) {
22 LOGGER.warn(getName(), e);
23 }
24 }
25 }

3 、 该线程会一直循环监听想该selector注册过的server channel所感兴趣的事件(OP_ACCEPT),当有新的连接请求时,selector就会返回,keys就是请求连接的所有的包含channel的key集合。

SelectionKey有如下属性:

  • interest集合(使用&操作SelectionKey.OP_ACCEPT和key.interestOps())
  • ready集合(key.readyOps(),可以使用&操作检测该集合,也可以使用is方法)
  • Channel(key.channel())
  • Selector(key.selector())
  • 附加对象(key.attach(obj) Object obj = key.attachment())

    4、 然后遍历该集合,如果集合中的key没有被cancel,并且这个key的channel已经做好接受一个新的socket连接的准备,则接受该连接。

    accept()的具体代码如下:

    01 private void accept() {
    02 SocketChannel channel = null;
    03 try {
    04 //从服务器端获取管道,为一个新的连接返回channel
    05 channel = serverChannel.accept();
    06 //配置管道为非阻塞
    07 channel.configureBlocking(false);
    08
    09 //前端连接工厂对管道进行配置,设置socket的收发缓冲区大小,TCP延迟等
    10 //然后由成员变量factory的类型生产对于的类型的连接
    11 //比如ServerConnectionFactory会返回ServerConnection实例,并对其属性进行设置
    12 FrontendConnection c = factory.make(channel);
    13 //设置连接属性
    14 c.setAccepted(true);
    15 c.setId(ID_GENERATOR.getId());
    16 //从processors中选择一个NIOProcessor,将其和该连接绑定
    17 NIOProcessor processor = nextProcessor();
    18 c.setProcessor(processor);
    19 //向读反应堆注册该连接,加入待处理队列
    20 //select选择到感兴趣的事件后,会进行调用connection的read函数
    21 processor.postRegister(c);
    22 } catch (Throwable e) {
    23 closeChannel(channel);
    24 LOGGER.warn(getName(), e);
    25 }
    26 }

    首先从serverchannel中accept后会返回一个socketchannel对象,然后设置该socket channel属性位非阻塞模式,然后将channel交给ServerConnectionFactory工厂,会产生一个ServerConnection对象。

    \

    FrontendConnectionFactory是一个抽象类,其中的getConnection方法是抽象方法,有具体子类连接工厂来实现。FrontendConnectionFactory的make方法对channel中的socket进行属性设置(接收和发送的缓冲区大小、延时、KeepAlive等),然后调用具体调用具体子类(ServerConnectionFactory)的getConnection来返回一个ServerConne

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇(一)什么是高可用性解决方案? 下一篇复合索引的列顺序判断

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: