Rumah pembangunan bahagian belakang tutorial php Apache Mina 学习笔记(2) - 基础

Apache Mina 学习笔记(2) - 基础

Jan 18, 2017 am 09:48 AM
apache Mina

在第一章中,我们对MINA有了一个大致的了解,在本章中,我们会对MINA中的客户端/服务器模型做一个细致的分析。并且也会提供一些基于TCP,UDP的例子。

应用程序结构

服务端结构
客户端结构

简单的TCP服务器
简单的TCP客户端
简单的UDP服务器
简单的UDP客户端

总结应用程序结构

一个采用MINA框架的应用程序结构如下:

306.png

从上图可以看到,MINA作为一个中间层连接你的应用程序和网络底层,它可以处理TCP,UDP甚至一个串行通信协议(RS-232C),因此你可以更关注于在MINA上面设计应用程序,而不需要了解底层网络通信的复杂性。

下面看看MINA的内部:

307.png

通常来讲,MINA应用程序被分成三层。

I/O 服务 - 真正的I/O操作
I/O 过滤链 - 过滤/传输数据
I/O Handler - 在这里完成程序的逻辑

所以,要创建一个MINA应用程序,你只需要做:

创建I/O服务 - 选择已经提供的服务(Acceptor)或者自己创建的服务
创建过滤链 - 选择已经提供的过滤链或者创建自己定制的过滤链
创建I/OHandler - 写业务逻辑,处理各种不同的消息以上是MINA的总体结构,

下面看看服务端的结构:

308.png

简单来说就是有一个I/O Acceptor在服务端监听即将到来的连接或者数据包,对于一个新的连接到来,一个新的session会被创建,并且由该连接随后到来的请求会在这个session中进行处理。所有的包由session接受,并通过上图指示的过滤链。过滤链被用来修改包的内容(例如转化成Objects,添加或者剔除一些信息)。最后这些包交友IOHandler处理。另外需要注意的是,当一个连接到来时,一个session就会被建立,而不管这个连接最后有没有成功,session都会被建立。

下面是客户端模型:

309.png



客户端跟服务端刚好是一个相反的状态。

其中客户端会有一个IOConnector用来连接上服务端。而所有的处理仍然有IOHandler完成。

简单的TCP服务器

下面,创建一个简单的TCP服务器作为演示:首先你需要将一些需要的包导入到IDE或者配置你的CLASSPATH,具体方法就不详述了,需要的包有:

MINA 2.x Core
JDK 1.5 or greater
SLF4J 1.3.0 or greater

Log4J 1.2 users: slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
Log4J 1.3 users: slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
java.util.logging users: slf4j-api.jar and slf4j-jdk14.jar
IMPORTANT: Please make sure you are using the right slf4j-*.jar that matches to your logging framework.

准备工作做完之后,我们开始编写代码

import java.net.InetSocketAddress;  
import org.apache.mina.core.service.IoAcceptor;  
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  
public class MinaTimeServer  
{  
    private static final int PORT = 9123;  
    public static void main( String[] args ) throws IOException  
    {  
        IoAcceptor acceptor = new NioSocketAcceptor();  
        acceptor.bind( new InetSocketAddress(PORT) );  
    }  
}
Salin selepas log masuk

接下来,我们在上面代码中,添加过滤链的配置。

import java.io.IOException;  
import java.net.InetSocketAddress;  
import java.nio.charset.Charset;  
import org.apache.mina.core.service.IoAcceptor;  
import org.apache.mina.filter.codec.ProtocolCodecFilter;  
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
import org.apache.mina.filter.logging.LoggingFilter;  
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  
public class MinaTimeServer  
{  
    public static void main( String[] args )  
    {  
        IoAcceptor acceptor = new NioSocketAcceptor();  
        acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  //这里会建立所有的日志信息  
        acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); //第二个过滤器用来传递数据  
        acceptor.bind( new InetSocketAddress(PORT) );  
    }  
}
Salin selepas log masuk

接下来,我们需要定义用来处理消息的Handler,这个Handler类必须实现IoHandler接口。在MINA中,这个Handler是程序开发的关键,在这个教学中,我们会继承于IoHandlerAdapter。

import java.util.Date;  
import org.apache.mina.core.session.IdleStatus;  
import org.apache.mina.core.service.IoHandlerAdapter;  
import org.apache.mina.core.session.IoSession;  
  
public class TimeServerHandler extends IoHandlerAdapter  
{  
    @Override  
    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception  
    {  
        cause.printStackTrace();  
    }  
    @Override  
    public void messageReceived( IoSession session, Object message ) throws Exception  
    {  
        String str = message.toString();  
        if( str.trim().equalsIgnoreCase("quit") ) {  
            session.close();  
            return;  
        }  
        Date date = new Date();  
        session.write( date.toString() );  
        System.out.println("Message written...");  
    }  
    @Override  
    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception  
    {  
        System.out.println( "IDLE " + session.getIdleCount( status ));  
    }  
}
Salin selepas log masuk

最后,完整的服务器代码如下:

import java.io.IOException;  
import java.net.InetSocketAddress;  
import java.nio.charset.Charset;  
  
import org.apache.mina.core.service.IoAcceptor;  
import org.apache.mina.core.session.IdleStatus;  
import org.apache.mina.filter.codec.ProtocolCodecFilter;  
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
import org.apache.mina.filter.logging.LoggingFilter;  
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  
public class MinaTimeServer  
{  
    private static final int PORT = 9123;  
    public static void main( String[] args ) throws IOException  
    {  
        IoAcceptor acceptor = new NioSocketAcceptor();  
        acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  
        acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));  
        acceptor.setHandler( new TimeServerHandler() );  //这里设置Handler  
        acceptor.getSessionConfig().setReadBufferSize( 2048 );       //这是设置ssesion缓冲区  
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );  
        acceptor.bind( new InetSocketAddress(PORT) );  
    }  
}
Salin selepas log masuk

运行该服务器,然后打开终端输入命令:telnet 127.0.0.1 9123 即可看到,当你输入非“quit” 的任何字符时,服务器都会返回当前的时间到终端来。

简单的TCP客户端

import java.net.InetSocketAddress;  
import org.apache.mina.core.RuntimeIoException;  
import org.apache.mina.core.future.ConnectFuture;  
import org.apache.mina.core.session.IoSession;  
import org.apache.mina.example.sumup.codec.SumUpProtocolCodecFactory;  
import org.apache.mina.filter.codec.ProtocolCodecFilter;  
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
import org.apache.mina.filter.logging.LoggingFilter;  
import org.apache.mina.transport.socket.nio.NioSocketConnector;  
   
  /** 
   * (<strong>Entry Point</strong>) Starts SumUp client. 
   * 
   * @author <a href="http://mina.apache.org">Apache MINA Project</a> 
   */  
  public class Client {  
     private static final String HOSTNAME = "localhost";  
    
      private static final int PORT = 8080;  
    
     private static final long CONNECT_TIMEOUT = 30*1000L; // 30 seconds  
    
      // Set this to false to use object serialization instead of custom codec.  
      private static final boolean USE_CUSTOM_CODEC = true;  
    
      public static void main(String[] args) throws Throwable {  
          if (args.length == 0) {  
              System.out.println("Please specify the list of any integers");  
              return;  
          }  
    
          // prepare values to sum up  
         int[] values = new int[args.length];  
          for (int i = 0; i < args.length; i++) {  
              values[i] = Integer.parseInt(args[i]);  
          }  
    
          NioSocketConnector connector = new NioSocketConnector();  
    
          // Configure the service.  
          connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);  
          if (USE_CUSTOM_CODEC) {
Salin selepas log masuk
connector.getFilterChain().addLast(  
                      "codec",  
                      new ProtocolCodecFilter(  
                              new SumUpProtocolCodecFactory(false)));  
          } else {  
              connector.getFilterChain().addLast(  
                      "codec",  
                      new ProtocolCodecFilter(  
                              new ObjectSerializationCodecFactory()));  
          }  
          connector.getFilterChain().addLast("logger", new LoggingFilter());  
    
          connector.setHandler(new ClientSessionHandler(values));  
    
          IoSession session;  
          for (;;) {  
              try {  
                  ConnectFuture future = connector.connect(new InetSocketAddress(  
                          HOSTNAME, PORT));  
                  future.awaitUninterruptibly();  
                  session = future.getSession();  
                  break;  
             } catch (RuntimeIoException e) {  
                  System.err.println("Failed to connect.");  
                  e.printStackTrace();  
                  Thread.sleep(5000);  
              }  
          }  
    
          // wait until the summation is done  
         session.getCloseFuture().awaitUninterruptibly();  
            
          connector.dispose();  
      }  
  }
Salin selepas log masuk

UDP的例子不写了,需要的话到Apache官网去看看。

http://mina.apache.org/mina-project/userguide/ch2-basics/sample-udp-client.html

以上就是Apache Mina 学习笔记(2) - 基础的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan 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)

Cara Menjalankan Projek H5 Cara Menjalankan Projek H5 Apr 06, 2025 pm 12:21 PM

Menjalankan projek H5 memerlukan langkah -langkah berikut: memasang alat yang diperlukan seperti pelayan web, node.js, alat pembangunan, dan lain -lain. Membina persekitaran pembangunan, membuat folder projek, memulakan projek, dan menulis kod. Mulakan pelayan pembangunan dan jalankan arahan menggunakan baris arahan. Pratonton projek dalam penyemak imbas anda dan masukkan URL Server Pembangunan. Menerbitkan projek, mengoptimumkan kod, menggunakan projek, dan menyediakan konfigurasi pelayan web.

Cara Mengeksport PDF dengan XML Cara Mengeksport PDF dengan XML Apr 03, 2025 am 06:45 AM

Terdapat dua cara untuk mengeksport XML ke PDF: menggunakan XSLT dan menggunakan perpustakaan mengikat data XML. XSLT: Buat lembaran gaya XSLT, tentukan format PDF untuk menukar data XML menggunakan pemproses XSLT. Perpustakaan mengikat data XML: Import Perpustakaan Pengikat Data XML Buat dokumen PDF Memuatkan Fail PDF Eksport Data XML. Kaedah mana yang lebih baik untuk fail PDF bergantung kepada keperluan. XSLT menyediakan fleksibiliti, manakala perpustakaan mengikat data mudah dilaksanakan; Untuk penukaran mudah, perpustakaan mengikat data lebih baik, dan untuk penukaran yang kompleks, XSLT lebih sesuai.

Penyelesaian Masalah Apache: Diagnosis & Menyelesaikan Kesalahan Biasa Penyelesaian Masalah Apache: Diagnosis & Menyelesaikan Kesalahan Biasa Apr 03, 2025 am 12:07 AM

Kesalahan Apache boleh didiagnosis dan diselesaikan dengan melihat fail log. 1) Lihat fail ralat.log, 2) Gunakan perintah grep untuk menapis ralat dalam nama domain tertentu, 3) Bersihkan fail log secara berkala dan mengoptimumkan konfigurasi, 4) Gunakan alat pemantauan untuk memantau dan berjaga -jaga dalam masa nyata. Melalui langkah -langkah ini, kesilapan Apache boleh didiagnosis dengan berkesan dan diselesaikan.

Cara menjana pom.xml Cara menjana pom.xml Apr 03, 2025 am 06:00 AM

Terdapat cara berikut untuk menghasilkan fail pom.xml: Gunakan Maven Archetype untuk menyediakan templat projek yang telah ditetapkan untuk menghasilkan fail POM.xml secara automatik untuk jenis projek tertentu. Gunakan plugin Maven Helper untuk menyediakan arahan untuk menghasilkan fail POM.xml. Buat secara manual untuk menyesuaikan fail pom.xml untuk projek itu.

Cara menetapkan pengekodan aksara di sisi pelayan untuk menyelesaikan meja bootstrap yang dihiasi Cara menetapkan pengekodan aksara di sisi pelayan untuk menyelesaikan meja bootstrap yang dihiasi Apr 07, 2025 pm 12:00 PM

Untuk menetapkan pengekodan aksara di sisi pelayan untuk menyelesaikan jadual bootstrap yang dihiasi, anda perlu mengikuti langkah -langkah berikut: periksa pengekodan aksara pelayan; Edit fail konfigurasi pelayan; Tetapkan pengekodan watak ke UTF-8; simpan dan mulakan semula pelayan; Sahkan pengekodan.

Tidak dapat memulakan mysql di xampp Tidak dapat memulakan mysql di xampp Apr 08, 2025 pm 03:15 PM

Terdapat banyak sebab mengapa XAMPP gagal memulakan MySQL, termasuk konflik pelabuhan, kesilapan fail konfigurasi, kebenaran sistem yang tidak mencukupi, isu ketergantungan perkhidmatan, dan isu pemasangan. Langkah -langkah penyelesaian masalah adalah seperti berikut: 1) Periksa konflik pelabuhan; 2) Semak fail konfigurasi; 3) Periksa keizinan sistem; 4) semak kebergantungan perkhidmatan; 5) Pasang semula MySQL. Ikuti langkah -langkah ini dan anda boleh mencari dan menyelesaikan masalah yang menyebabkan permulaan MySQL gagal.

Cara Pratonton halaman Bootstrap Cara Pratonton halaman Bootstrap Apr 07, 2025 am 10:06 AM

Kaedah pratonton halaman bootstrap adalah: buka fail HTML secara langsung dalam penyemak imbas; Secara automatik menyegarkan penyemak imbas menggunakan plug-in pelayan langsung; dan membina pelayan tempatan untuk mensimulasikan persekitaran dalam talian.

Ringkasan kelemahan phpmyadmin Ringkasan kelemahan phpmyadmin Apr 10, 2025 pm 10:24 PM

Kunci strategi pertahanan keselamatan phpmyadmin adalah: 1. Gunakan versi terkini Phpmyadmin dan kerap mengemas kini PHP dan MySQL; 2. Mengawal hak akses, penggunaan. Htaccess atau kawalan akses pelayan web; 3. Dayakan kata laluan yang kuat dan pengesahan dua faktor; 4. Menyokong pangkalan data secara teratur; 5. Berhati -hati semak fail konfigurasi untuk mengelakkan mendedahkan maklumat sensitif; 6. Gunakan Firewall Aplikasi Web (WAF); 7. Menjalankan audit keselamatan. Langkah-langkah ini secara berkesan dapat mengurangkan risiko keselamatan yang disebabkan oleh phpmyadmin disebabkan oleh konfigurasi yang tidak betul, versi yang lebih lama atau risiko keselamatan alam sekitar, dan memastikan keselamatan pangkalan data.

See all articles