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
|
}
|
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
|
}
|
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
|
}
|
到此为止将连接部分都写完了,在连接部分还有些零碎的东西,比如handler、pollingsession了。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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