搜尋
首頁資料庫mysql教程Mina源码阅读笔记(四)—Mina的连接IoConnector2

接着Mina源码阅读笔记(四)—Mina的连接IoConnector1,,我们继续: AbstractIoAcceptor: 001 package org.apache.mina.core.rewrite.service; 002 003 import java.io.IOException; 004 import java.net.SocketAddress; 005 import java.util.ArrayList; 0

接着Mina源码阅读笔记(四)—Mina的连接IoConnector1,,我们继续:

AbstractIoAcceptor:

001 package org.apache.mina.core.rewrite.service;

002  

003 import java.io.IOException;

004 import java.net.SocketAddress;

005 import java.util.ArrayList;

006 import java.util.Collections;

007 import java.util.HashSet;

008 import java.util.List;

009 import java.util.Set;

010 import java.util.concurrent.Executor;

011  

012 public abstract class AbstractIoAcceptor extends AbstractIoService implements

013         IoAcceptor {

014  

015     private final List<socketaddress> defaultLocalAddresses = </socketaddress>new ArrayList<socketaddress>();</socketaddress>

016  

017     private final List<socketaddress> unmodifiableDeffaultLocalAddresses = Collections</socketaddress>

018             .unmodifiableList(defaultLocalAddresses);

019  

020     private final Set<socketaddress> boundAddresses = </socketaddress>new HashSet<socketaddress>();</socketaddress>

021  

022     private boolean disconnectOnUnbind = true;

023  

024     /** 这里不是很明白,为什么要用protected 而 不是private */

025     protected final Object bindLock = new Object();

026  

027     /**

028      * 注意这个构造方法是一定要写的,否则编译不通过:抽象类继承时候,构造方法都要写,而且必须包含super

029      *

030      * @param param

031      *            sessionConfig

032      * @param executor

033      */

034     protected AbstractIoAcceptor(Object param, Executor executor) {

035         super(param, executor);

036         defaultLocalAddresses.add(null);

037     }

038  

039     @Override

040     public SocketAddress getLocalAddress() {

041  

042         Set<socketaddress> localAddresses = getLocalAddresses();</socketaddress>

043         if (localAddresses.isEmpty()) {

044             return null;

045         }

046         return localAddresses.iterator().next();

047     }

048  

049     @Override

050     public final Set<socketaddress> getLocalAddresses() {</socketaddress>

051         Set<socketaddress> localAddresses = </socketaddress>new HashSet<socketaddress>();</socketaddress>

052         synchronized (boundAddresses) {

053             localAddresses.addAll(boundAddresses);

054         }

055         return localAddresses;

056     }

057  

058     @Override

059     public void bind(SocketAddress localAddress) throws IOException {

060         // TODO Auto-generated method stub

061  

062     }

063  

064     @Override

065     public void bind(Iterable extends SocketAddress> localAddresses)

066             throws IOException {

067         // TODO isDisposing()

068  

069         if (localAddresses == null) {

070             throw new IllegalArgumentException("localAddresses");

071         }

072  

073         List<socketaddress> localAddressesCopy = </socketaddress>new ArrayList<socketaddress>();</socketaddress>

074  

075         for (SocketAddress a : localAddresses) {

076             // TODO check address type

077             localAddressesCopy.add(a);

078         }

079  

080         if (localAddressesCopy.isEmpty()) {

081             throw new IllegalArgumentException("localAddresses is empty");

082         }

083  

084         boolean active = false;

085  

086         synchronized (bindLock) {

087             synchronized (boundAddresses) {

088                 if (boundAddresses.isEmpty()) {

089                     active = true;

090                 }

091             }

092         }

093         /** implement in abstractIoService */

094         if (getHandler() == null) {

095             throw new IllegalArgumentException("handler is not set");

096         }

097  

098         try {

099             Set<socketaddress> addresses = bindInternal(localAddressesCopy);</socketaddress>

100  

101             synchronized (boundAddresses) {

102                 boundAddresses.addAll(addresses);

103             }

104         catch (IOException e) {

105             throw e;

106         catch (RuntimeException e) {

107             throw e;

108         catch (Throwable e) {

109             throw new RuntimeException("Filed ti bind");

110         }

111          

112         if(active){

113             //do sth

114         }

115     }

116  

117     protected abstract Set<socketaddress> bindInternal(</socketaddress>

118             List extends SocketAddress> localAddress) throws Exception;

119  

120     @Override

121     public void unbind(SocketAddress localAddress) {

122         // TODO Auto-generated method stub

123          

124     }

125 }
polling:

01 package org.apache.mina.core.rewrite.polling;

02  

03 import java.net.SocketAddress;

04 import java.nio.channels.ServerSocketChannel;

05 import java.util.List;

06 import java.util.Set;

07 import java.util.concurrent.Executor;

08 import java.util.concurrent.Semaphore;

09 import java.util.concurrent.atomic.AtomicReference;

10  

11 import org.apache.mina.core.rewrite.service.AbstractIoAcceptor;

12  

13 public abstract class AbstractPollingIoAcceptor extends AbstractIoAcceptor {

14  

15     private final Semaphore lock = new Semaphore(1);

16  

17     private volatile boolean selectable;

18  

19     private AtomicReference<acceptor> acceptorRef = </acceptor>new AtomicReference<acceptor>();</acceptor>

20  

21     /**

22      * define the num of sockets that can wait to be accepted.

23      */

24     protected int backlog = 50;

25  

26     /**

27      * 一样的,这个构造方法也要写

28      *

29      * @param param

30      * @param executor

31      */

32     protected AbstractPollingIoAcceptor(Object param, Executor executor) {

33         super(param, executor);

34         // TODO Auto-generated constructor stub

35     }

36  

37     /**

38      * init the polling system. will be called at construction time

39      *

40      * @throws Exception

41      */

42     protected abstract void init() throws Exception;

43  

44     protected abstract void destory() throws Exception;

45  

46     protected abstract int select() throws Exception;

47     /**这里有点儿变动*/

48     protected abstract ServerSocketChannel open(SocketAddress localAddress) throws Exception;

49  

50     @Override

51     protected Set<socketaddress> bindInternal(</socketaddress>

52             List extends SocketAddress> localAddress) throws Exception {

53         // ...

54         try {

55             lock.acquire();

56             Thread.sleep(10);

57         finally {

58             lock.release();

59         }

60         // ...

61         return null;

62     }

63  

64     /**

65      * this class is called by startupAcceptor() method it's a thread accepting

66      * incoming connections from client

67      *

68      * @author ChenHui

69      *

70      */

71     private class Acceptor implements Runnable {

72         @Override

73         public void run() {

74             assert (acceptorRef.get() == this);

75  

76             int nHandles = 0;

77  

78             lock.release();

79  

80             while (selectable) {

81                 try {

82                     int selected = select();

83  

84                     // nHandles+=registerHandles();

85  

86                     if (nHandles == 0) {

87                         acceptorRef.set(null);

88                         // ...

89                     }

90                 catch (Exception e) {

91  

92                 }

93             }

94         }

95     }

96 }
好了最后看NioSoeketAcceptor:

001 package org.apache.mina.rewrite.transport.socket.nio;

002  

003 import java.net.InetSocketAddress;

004 import java.net.ServerSocket;

005 import java.net.SocketAddress;

006 import java.nio.channels.SelectionKey;

007 import java.nio.channels.Selector;

008 import java.nio.channels.ServerSocketChannel;

009 import java.util.concurrent.Executor;

010  

011 import org.apache.mina.core.rewrite.polling.AbstractPollingIoAcceptor;

012 import org.apache.mina.rewrite.transport.socket.SocketAcceptor;

013  

014 public final class NioSocketAcceptor extends AbstractPollingIoAcceptor

015         implements SocketAcceptor {

016  

017     private volatile Selector selector;

018  

019     protected NioSocketAcceptor(Object param, Executor executor) {

020         super(param, executor);

021         // TODO Auto-generated constructor stub

022     }

023  

024     @Override

025     public int getManagedSessionCount() {

026         // TODO Auto-generated method stub

027         return 0;

028     }

029  

030     /**

031      * 这个方法继承自AbstractIoAcceptor

032      *

033      * The type NioSocketAcceptor must implement the inherited abstract method

034      * SocketAcceptor.getLocalAddress() to override

035      * AbstractIoAcceptor.getLocalAddress()

036      */

037     @Override

038     public InetSocketAddress getLocalAddress() {

039         // TODO Auto-generated method stub

040         return null;

041     }

042  

043     @Override

044     public void setDefaultLocalAddress(InetSocketAddress localAddress) {

045         // TODO Auto-generated method stub

046  

047     }

048  

049     @Override

050     public boolean isReuseAddress() {

051         // TODO Auto-generated method stub

052         return false;

053     }

054  

055     @Override

056     protected void init() throws Exception {

057         selector = Selector.open();

058     }

059  

060     @Override

061     protected void destory() throws Exception {

062         if (selector != null) {

063             selector.close();

064         }

065     }

066  

067     @Override

068     protected int select() throws Exception {

069         return selector.select();

070     }

071  

072     @Override

073     protected void dispose0() throws Exception {

074         // TODO Auto-generated method stub

075  

076     }

077  

078     protected ServerSocketChannel open(SocketAddress localAddress)

079             throws Exception {

080         ServerSocketChannel channel =ServerSocketChannel.open();

081          

082         boolean success=false;

083          

084         try{

085             channel.configureBlocking(false);

086              

087             ServerSocket socket=channel.socket();

088              

089             socket.setReuseAddress(isReuseAddress());

090              

091             socket.bind(localAddress);

092              

093             channel.register(selector, SelectionKey.OP_ACCEPT);

094              

095             success=true;

096         }finally{

097             if(!success){

098                 //close(channel);

099             }

100         }

101         return channel;

102     }

103  

104     @Override

105     public boolean isActive() {

106         // TODO Auto-generated method stub

107         return false;

108     }

109  

110 }
------------------------------------------------------

到此为止将连接部分都写完了,在连接部分还有些零碎的东西,比如handlerpollingsession了。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
小红书笔记怎么删除小红书笔记怎么删除Mar 21, 2024 pm 08:12 PM

小红书笔记怎么删除?在小红书APP中是可以编辑笔记的,多数的用户不知道小红书笔记如何的删除,接下来就是小编为用户带来的小红书笔记删除方法图文教程,感兴趣的用户快来一起看看吧!小红书使用教程小红书笔记怎么删除1、首先打开小红书APP进入到主页面,选择右下角【我】进入到专区;2、之后在我的专区,点击下图所示的笔记页面,选择要删除的笔记;3、进入到笔记页面,右上角【三个点】;4、最后下方会展开功能栏,点击【删除】即可完成。

小红书删除的笔记能恢复吗小红书删除的笔记能恢复吗Oct 31, 2023 pm 05:36 PM

小红书删除的笔记不能恢复。小红书作为一款知识分享和购物平台,为用户提供了记录笔记和收藏有用信息的功能。根据小红书的官方说明,已经删除的笔记是无法恢复的。小红书平台并没有提供专门的笔记恢复功能。这意味着,一旦在小红书中删除了笔记,无论是不小心误删还是其他原因,一般情况下是无法从平台上找回被删除的内容的。如果遇到特殊情况,可以尝试联系小红书的客服团队,看是否能够协助解决问题。

小红书发布过的笔记不见了怎么办?它刚发的笔记搜不到的原因是什么?小红书发布过的笔记不见了怎么办?它刚发的笔记搜不到的原因是什么?Mar 21, 2024 pm 09:30 PM

作为一名小红书的用户,我们都曾遇到过发布过的笔记突然不见了的情况,这无疑让人感到困惑和担忧。在这种情况下,我们该怎么办呢?本文将围绕“小红书发布过的笔记不见了怎么办”这一主题,为你详细解答。一、小红书发布过的笔记不见了怎么办?首先,不要惊慌。如果你发现笔记不见了,保持冷静是关键,不要慌张。这可能是由于平台系统故障或操作失误引起的。检查发布记录很简单。只需打开小红书App,点击“我”→“发布”→“所有发布”,就可以查看自己的发布记录。在这里,你可以轻松找到之前发布的笔记。3.重新发布。如果找到了之

如何在最新的iOS 17系统中连接iPhone上的Apple Notes如何在最新的iOS 17系统中连接iPhone上的Apple NotesSep 22, 2023 pm 05:01 PM

使用添加链接功能在iPhone上链接AppleNotes。笔记:如果您已安装iOS17,则只能在iPhone上的AppleNotes之间创建链接。在iPhone上打开“备忘录”应用。现在,打开要在其中添加链接的注释。您还可以选择创建新备忘录。点击屏幕上的任意位置。这将向您显示一个菜单。点击右侧的箭头以查看“添加链接”选项。点击它。现在,您可以键入注释的名称或网页URL。然后,点击右上角的完成,添加的链接将出现在笔记中。如果要添加指向某个单词的链接,只需双击该单词即可将其选中,选择“添加链接”并按

使用PHP连接MariaDB数据库使用PHP连接MariaDB数据库May 17, 2023 am 08:24 AM

MariaDB是一种开源的关系型数据库管理系统,它是MySQL的一个分支。PHP作为一种开源的服务器端脚本语言,被广泛应用于Web开发中。在很多Web开发项目中,需要使用PHP连接到MariaDB数据库,以便在Web应用程序中存储和检索数据。这篇文章将介绍如何使用PHP编写代码来连接MariaDB数据库。一、安装MariaDB服务器在使用PHP连接Maria

小红书怎么在笔记中添加商品链接 小红书在笔记中添加商品链接教程小红书怎么在笔记中添加商品链接 小红书在笔记中添加商品链接教程Mar 12, 2024 am 10:40 AM

  小红书怎么在笔记中添加商品链接?在小红书这款app中用户不仅可以浏览各种内容还可以进行购物,所以这款app中关于购物推荐、好物分享的内容是非常多的,如果小伙伴在这款app也是一个达人的话,也可以分享一些购物经验,找到商家进行合作,在笔记中添加连接之类的,很多人都愿意使用这款app购物,因为不仅方便,而且有很多达人会进行一些推荐,可以一边浏览有趣内容,一边看看有没有适合自己的衣服商品。一起看看如何在笔记中添加商品链接吧!小红书笔记添加商品链接方法  在手机桌面上打开app。  在app首页点击

Python在软件源码保护中的应用实践Python在软件源码保护中的应用实践Jun 29, 2023 am 11:20 AM

Python语言作为一种高级编程语言,具有简单易学、易读易写等特点,在软件开发领域中得到了广泛的应用。然而,由于Python的开源特性,源代码很容易被他人轻易获取,这就给软件源码保护带来了一些挑战。因此,在实际应用中,我们常常需要采取一些方法来保护Python源代码,确保其安全性。在软件源码保护中,有多种针对Python的应用实践可供选择。下面将介绍几种常见

如何在沉浸式阅读器中使用Microsoft Reader Coach如何在沉浸式阅读器中使用Microsoft Reader CoachMar 09, 2024 am 09:34 AM

在这篇文章中,我们将向你展示如何在WindowsPC上的沉浸式阅读器中使用Microsoft阅读教练。阅读指导功能帮助学生或个人练习阅读并培养他们的识字技能。你从阅读支持的应用程序中的一段或一份文档开始,基于此,你的阅读报告由阅读教练工具生成。阅读报告显示了阅读的准确性、阅读所用的时间、每分钟的正确单词数,以及你在阅读时发现最具挑战性的单词。你还将能够练习这些单词,这总体上有助于培养你的阅读技能。目前,仅有Office或Microsoft365(包括OneNoteforWeb和WordforWe

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版