ホームページ データベース mysql チュートリアル Mina源码阅读笔记(四)—Mina的连接IoConnector2

Mina源码阅读笔记(四)—Mina的连接IoConnector2

Jun 07, 2016 pm 03:15 PM
Mina ソースコード ノート 接続する 読む

接着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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Win11 ゲームパッド接続完全ガイド Win11 ゲームパッド接続完全ガイド Jan 02, 2024 pm 05:26 PM

最新の win11 システムにアップデートした後、多くのユーザーがゲームをプレイするためにコントローラーを接続する方法がわかりません。そのため、今日は win11 コントローラーの接続に関する詳細なチュートリアルをお届けしました。まだ接続が完了していない場合は、操作方法を見てみましょう。 win11 でコントローラーを接続する方法: 1. 下の [スタート] をクリックし、Windows の設定に入り、[コントロール パネル] を開きます。 2. 入力すると、「デバイスとプリンターの表示」が表示されますので、入力します。 3. この時点で、コントローラー デバイスに関する情報が表示され、接続するだけです。 4. 接続に成功すると「√」が表示され、接続が完了します。

小紅書メモを削除する方法 小紅書メモを削除する方法 Mar 21, 2024 pm 08:12 PM

小紅書メモを削除するにはどうすればよいですか? メモは小紅書アプリで編集できます。ほとんどのユーザーは小紅書メモの削除方法を知りません。次に、エディターがユーザーに小紅書メモの削除方法に関する写真とテキストを提供します。チュートリアル、興味のあるユーザーが来て、それを受講してください見てください!小紅書使い方チュートリアル 小紅書メモの削除方法 1. まず小紅書アプリを開いてメインページに入り、右下隅の[自分]を選択して特別エリアに入ります; 2. 次に、マイエリアで、表示されているメモページをクリックします下の図で、削除したいメモを選択します; 3. メモページに入り、右上隅の [3 つの点] をクリックします; 4. 最後に、下部に機能バーが展開され、[削除] をクリックして完了します。

win7プリンターに接続できませんエラーコード0x0000011b win7プリンターに接続できませんエラーコード0x0000011b Dec 26, 2023 pm 10:01 PM

さまざまな印刷操作のためにコンピューターを使用してプリンターに接続する必要があることがよくありますが、一部のユーザーは、win7 がプリンター 0x0000011b に接続できないという問題に遭遇することがあります。 win7 はプリンター 0x0000011b1 に接続できません。ショートカット キー「win+r」、「regedit」と入力します。 2. 次のパス「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print」を見つけます。 3. 右クリックして新しい値「DWORD ( 32 ビット) の値 (D) を入力し、値を 0 に設定します。新しいプロジェクトに「RpcAuthnLevelPri」という名前を付けます。

体脂肪計の接続方法 体脂肪計の接続方法 Mar 07, 2024 pm 04:50 PM

Keep 体脂肪計の接続方法 Keep には特別に設計された体脂肪計がありますが、ほとんどのユーザーは Keep 体脂肪計の接続方法を知りません。エディターがユーザーにもたらすもの、興味のあるユーザーは見に来てください! Keep 体脂肪計の接続方法 1. まず Keep ソフトウェアを開き、メイン ページに移動し、右下隅の [マイ] をクリックして、[スマート ハードウェア] を選択します; 2. 次に、[マイ スマート デバイス] ページで、中央の[デバイスの追加]ボタンをクリックします; 3、インターフェイスを追加するデバイスを選択し、[スマート体脂肪/体重計]を選択します; 4.デバイスモデルの選択ページで、[体脂肪スケールを維持する]をクリックしますオプション; 5. 最後に、以下のインターフェイスで、最後に下部の[今すぐ追加]

小紅書に投稿したメモが見つからない場合はどうすればよいですか?送信したばかりのメモが見つからない理由は何ですか? 小紅書に投稿したメモが見つからない場合はどうすればよいですか?送信したばかりのメモが見つからない理由は何ですか? Mar 21, 2024 pm 09:30 PM

小紅書のユーザーとして、私たちは皆、公開されたノートが突然消えてしまう状況に遭遇したことがありますが、間違いなく混乱し、心配しています。この場合、どうすればよいでしょうか?この記事では、「小紅書が公開したメモが見つからない場合の対処方法」というテーマに焦点を当て、詳細な回答を提供します。 1. 小紅書が発行したメモが紛失した場合はどうすればよいですか?まず、パニックにならないでください。メモがなくなっていることに気づいた場合は、パニックに陥らず、落ち着いて行動することが重要です。これは、プラットフォームのシステム障害または操作エラーが原因である可能性があります。リリース記録の確認も簡単です。小紅書アプリを開き、「自分」→「公開」→「すべての出版物」をクリックするだけで、自分の出版記録を表示できます。ここでは、以前に公開されたノートを簡単に見つけることができます。 3.再投稿。見つかったら

小紅書でノートに商品リンクを追加する方法 小紅書でノートに商品リンクを追加するチュートリアル 小紅書でノートに商品リンクを追加する方法 小紅書でノートに商品リンクを追加するチュートリアル Mar 12, 2024 am 10:40 AM

小紅書でメモに商品リンクを追加するにはどうすればよいですか?小紅書アプリでは、ユーザーはさまざまなコンテンツを閲覧できるだけでなく、ショッピングもできるため、このアプリにはショッピングのおすすめや良い商品の共有に関するコンテンツがたくさんあります。このアプリでは、ショッピング体験を共有したり、協力してくれる販売者を見つけたり、メモにリンクを追加したりすることもできます。便利なだけでなく、専門家がいくつかの機能を備えているため、多くの人がこのアプリをショッピングに使用したいと考えています。興味深いコンテンツを閲覧して、自分に合った衣料品があるかどうかを確認できます。ノートに商品リンクを追加する方法を見てみましょう! 小紅書ノートに商品リンクを追加する方法 携帯電話のデスクトップでアプリを開きます。アプリのホームページをクリックします

プリンターのエラー コード 0x0000011b は何を意味しますか? プリンターのエラー コード 0x0000011b は何を意味しますか? Feb 18, 2024 pm 10:02 PM

プリンターに接続するときの 0x0000011b は何を意味しますか? ユーザーは、コンピューター、ラップトップ、またはその他のデバイスを使用するときに、さまざまなエラー コードに遭遇することがよくあります。このうち、0x0000011b は一般的なプリンター接続エラーコードです。では、プリンター 0x0000011b の接続は何を意味するのでしょうか?まず、プリンター接続の基本原理を理解する必要があります。コンピューターからファイルを印刷する必要がある場合、通常はプリンターをコンピューターに接続して、両者の間でデータを転送する必要があります。この接続は次の方法で行うことができます

共有プリンターがプリンターに接続できない 共有プリンターがプリンターに接続できない Feb 22, 2024 pm 01:09 PM

デジタル時代の発展に伴い、共有プリンターは現代のオフィス環境に欠かせないものとなっています。しかし、場合によっては共有プリンターに接続できないという問題が発生し、作業効率に影響を与えるだけでなく、トラブルが続発してしまうこともあります。この記事は、共有プリンターがプリンターに接続できない理由と解決策を探ることを目的としています。共有プリンタがプリンタに接続できない理由は数多くありますが、最も一般的なのはネットワークの問題です。共有プリンターとプリンター間のネットワーク接続が不安定または切断されると、正常に動作できなくなります。

See all articles