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 Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

更新了最新的win11系统之后有不少的用户不清楚该怎么连接手柄进行游戏,为此我们今天专给你们带来了win11连接手柄详细教程,如果你还没有完成连接就来看看怎么操作吧。win11怎么连接手柄:1、点击下方的开始然后进入windows设置开启“控制面板”。2、进入之后就可以找到“查看设备和打印机”进行进入。3、此时你能够看到手柄设备的信息,进行连接就行了。4、连接成功之后出现一个√,就可以完成连接了。

小红书笔记怎么删除?在小红书APP中是可以编辑笔记的,多数的用户不知道小红书笔记如何的删除,接下来就是小编为用户带来的小红书笔记删除方法图文教程,感兴趣的用户快来一起看看吧!小红书使用教程小红书笔记怎么删除1、首先打开小红书APP进入到主页面,选择右下角【我】进入到专区;2、之后在我的专区,点击下图所示的笔记页面,选择要删除的笔记;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体脂秤连接方法图文教程,感兴趣的用户快来一起看看吧!keep体脂秤怎么连接1、首先打开keep软件,进入到主页面点击右下角【我的】选择其中的【智能硬件】;2、然后在我的智能设备页面,中间【添加设备】按钮;3、之后在选择你要添加的设备界面,选择【智能体脂/体重秤】;4、接着在选择设备型号页面,点击【keep体脂秤】选项;5、最后在下图所示的界面,最底部的【立即添加】

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

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

连接打印机0x0000011b是什么意思在使用电脑、笔记本或者其他设备时,用户常常会遇到各种错误代码。其中,0x0000011b是一种常见的打印机连接错误代码。那么,连接打印机0x0000011b到底是什么意思呢?首先,我们需要了解一下打印机连接的基本原理。当我们需要从电脑上打印文件时,通常需要将打印机连接到电脑上,以便二者之间进行数据传输。这种连接可以通过

随着数字化时代的发展,共享打印机成为现代办公环境中不可或缺的一部分。然而,有时我们可能会遇到共享打印机无法连接到打印机的问题,这不仅会影响工作效率,还会带来一系列麻烦。本文旨在探讨共享打印机无法连接到打印机的原因和解决方法。共享打印机无法连接到打印机的原因有很多,其中最常见的原因是网络问题。如果共享打印机与打印机之间的网络连接不稳定或中断,那么就无法进行正常
