Rumah pangkalan data tutorial mysql Mina源码阅读笔记(四)—Mina的连接IoConnector2

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

Jun 07, 2016 pm 03:15 PM
Mina Kod sumber nota menyambung membaca

接着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了。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Lengkap untuk Sambungan Pad Permainan Win11 Panduan Lengkap untuk Sambungan Pad Permainan Win11 Jan 02, 2024 pm 05:26 PM

Selepas mengemas kini kepada sistem win11 terkini, ramai pengguna tidak pasti cara menyambungkan pengawal untuk bermain permainan Atas sebab ini, kami telah membawakan anda tutorial terperinci tentang menyambungkan pengawal win11 hari ini. mari kita lihat cara mengendalikannya. Cara menyambungkan pengawal dalam win11: 1. Klik Mula di bawah dan kemudian masukkan Tetapan Windows untuk membuka "Panel Kawalan". 2. Selepas masuk, anda boleh mencari "Lihat peranti dan pencetak" untuk masuk. 3. Pada ketika ini anda boleh melihat maklumat tentang peranti pengawal dan hanya membuat sambungan. 4. Selepas sambungan berjaya, √ muncul, dan sambungan selesai.

Bagaimana untuk memadam nota Xiaohongshu Bagaimana untuk memadam nota Xiaohongshu Mar 21, 2024 pm 08:12 PM

Bagaimana untuk memadamkan nota Xiaohongshu? pandangan! Tutorial penggunaan Xiaohongshu Cara memadam nota Xiaohongshu 1. Mula-mula buka APP Xiaohongshu dan masukkan halaman utama, pilih [Saya] di sudut kanan bawah untuk memasuki kawasan khas 2. Kemudian di kawasan Saya, klik pada halaman nota sebagai ditunjukkan di bawah , pilih nota yang anda mahu padamkan;

pencetak win7 tidak boleh menyambung kod ralat 0x0000011b pencetak win7 tidak boleh menyambung kod ralat 0x0000011b Dec 26, 2023 pm 10:01 PM

Banyak kali kita perlu menggunakan komputer untuk menyambung ke pencetak untuk pelbagai operasi pencetakan, tetapi kadangkala sesetengah pengguna akan menghadapi masalah yang win7 tidak dapat menyambung ke pencetak 0x0000011b Berikut adalah penyelesaian khusus. Win7 tidak boleh menyambung ke pencetak 0x0000011b1. Kekunci pintasan "win+r", masukkan "regedit" 2. Cari laluan berikut "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print" 3. Klik kanan untuk mencipta nilai baharu "DWORD ( 32-bit) nilai (D) dan Tetapkan nilai kepada 0. Namakan projek baharu "RpcAuthnLevelPri"

Cara sambung jaga lemak badan skali Cara sambung jaga lemak badan skali Mar 07, 2024 pm 04:50 PM

Bagaimana untuk menyambungkan penimbang lemak badan yang disimpan? editor membawa kepada pengguna , pengguna yang berminat datang dan lihat! Cara menyambungkan skala simpan lemak badan 1. Mula-mula buka perisian simpan, pergi ke halaman utama dan klik [Saya] di sudut kanan bawah untuk memilih [Perkakasan Pintar] 2. Kemudian pada halaman Peranti Pintar Saya, klik butang Butang [Tambah Peranti] di tengah 3 , kemudian pilih peranti yang anda ingin tambah antara muka, pilih [Smart Body Fat/Weight Scale] 4. Kemudian pada halaman pemilihan model peranti, klik pilihan [keep body fat scale]. ; 5. Akhir sekali, dalam antara muka yang ditunjukkan di bawah, akhirnya [Tambah Sekarang] di bahagian bawah

Apakah yang perlu saya lakukan jika nota yang saya siarkan di Xiaohongshu tiada? Apakah sebab mengapa nota yang dihantar tidak ditemui? Apakah yang perlu saya lakukan jika nota yang saya siarkan di Xiaohongshu tiada? Apakah sebab mengapa nota yang dihantar tidak ditemui? Mar 21, 2024 pm 09:30 PM

Sebagai pengguna Xiaohongshu, kita semua pernah menghadapi situasi di mana nota yang diterbitkan tiba-tiba hilang, yang sudah pasti mengelirukan dan membimbangkan. Dalam kes ini, apa yang perlu kita lakukan? Artikel ini akan menumpukan pada topik "Apa yang perlu dilakukan jika nota yang diterbitkan oleh Xiaohongshu hilang" dan memberi anda jawapan terperinci. 1. Apakah yang perlu saya lakukan jika nota yang diterbitkan oleh Xiaohongshu tiada? Pertama, jangan panik. Jika anda mendapati nota anda tiada, bertenang adalah kunci dan jangan panik. Ini mungkin disebabkan oleh kegagalan sistem platform atau ralat operasi. Menyemak rekod keluaran adalah mudah. Cuma buka Apl Xiaohongshu dan klik "Saya" → "Terbitkan" → "Semua Penerbitan" untuk melihat rekod penerbitan anda sendiri. Di sini anda boleh mencari nota yang disiarkan sebelum ini dengan mudah. 3.Siaran semula. Jika dijumpai

Cara menambah pautan produk dalam nota dalam Xiaohongshu Tutorial menambah pautan produk dalam nota dalam Xiaohongshu Cara menambah pautan produk dalam nota dalam Xiaohongshu Tutorial menambah pautan produk dalam nota dalam Xiaohongshu Mar 12, 2024 am 10:40 AM

Bagaimana untuk menambah pautan produk dalam nota dalam Xiaohongshu? Dalam aplikasi Xiaohongshu, pengguna bukan sahaja boleh menyemak imbas pelbagai kandungan tetapi juga membeli-belah, jadi terdapat banyak kandungan tentang cadangan membeli-belah dan perkongsian produk yang baik dalam aplikasi ini pada aplikasi ini, anda juga boleh berkongsi beberapa pengalaman membeli-belah, mencari peniaga untuk kerjasama, menambah pautan dalam nota, dll. Ramai orang sanggup menggunakan aplikasi ini untuk membeli-belah, kerana ia bukan sahaja mudah, tetapi juga mempunyai ramai Pakar akan membuat beberapa cadangan Anda boleh menyemak imbas kandungan yang menarik dan melihat sama ada terdapat produk pakaian yang sesuai dengan anda. Mari lihat cara menambah pautan produk pada nota Cara menambah pautan produk ke Xiaohongshu Notes Buka aplikasi pada desktop telefon mudah alih anda. Klik pada halaman utama apl

Apakah maksud kod ralat pencetak 0x0000011b? Apakah maksud kod ralat pencetak 0x0000011b? Feb 18, 2024 pm 10:02 PM

Apakah maksud 0x0000011b apabila menyambung kepada pencetak Pengguna sering menghadapi pelbagai kod ralat apabila menggunakan komputer, komputer riba atau peranti lain? Antaranya, 0x0000011b ialah kod ralat sambungan pencetak biasa. Jadi, apakah maksud menyambung pencetak 0x0000011b? Pertama, kita perlu memahami prinsip asas sambungan pencetak. Apabila kita perlu mencetak fail dari komputer, kita biasanya perlu menyambungkan pencetak ke komputer untuk pemindahan data antara kedua-duanya. Sambungan ini boleh dibuat melalui

Pencetak yang dikongsi tidak boleh menyambung ke pencetak Pencetak yang dikongsi tidak boleh menyambung ke pencetak Feb 22, 2024 pm 01:09 PM

Dengan perkembangan era digital, pencetak kongsi telah menjadi bahagian yang amat diperlukan dalam persekitaran pejabat moden. Walau bagaimanapun, kadangkala kita mungkin menghadapi masalah bahawa pencetak yang dikongsi tidak boleh disambungkan ke pencetak, yang bukan sahaja akan menjejaskan kecekapan kerja, tetapi juga menyebabkan beberapa siri masalah. Artikel ini bertujuan untuk meneroka sebab dan penyelesaian mengapa pencetak kongsi tidak boleh bersambung ke pencetak. Terdapat banyak sebab mengapa pencetak yang dikongsi tidak boleh menyambung ke pencetak, yang paling biasa ialah isu rangkaian. Jika sambungan rangkaian antara pencetak kongsi dan pencetak tidak stabil atau terganggu, operasi biasa tidak akan dapat dilakukan.

See all articles