рдиреЗрдЯреНрдЯреА + рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рдЙрддреНрдкрд╛рджрдХ рдЧреЗрдо рд╕рд░реНрд╡рд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕

Piccy.info - рдлреНрд░реА рдЗрдореЗрдЬ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рдиреЗрдЯреНрдЯреА рдкрд░ рдПрдХ рдЙрддреНрдкрд╛рджрдХ рдЧреЗрдо рд╕рд░реНрд╡рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВред
рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдЕрдВрддрд┐рдо рд░рд┐рдЬрд╝реЙрд░реНрдЯ рдореЗрдВ рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИред



рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред



рдЧреЗрдо рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╕рд╛рдордирд╛ рд╣реЛрддрд╛ рд╣реИред

рдЧреЗрдо рд╕рд░реНрд╡рд░ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреНрдпрд╛ рд╣реИрдВ?
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рддрдм:

...

рд╣рдо рдЕрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдиреЗрдЯреА рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреА рд╣реИ?


рдиреЗрдЯреНрдЯреА рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реАрдзрд╛ рдХрд╛рдо рд╕рдВрднрд╛рд▓реЗрдЧреАред рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рднреЗрдЬреЗрдВ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдкреИрдХреЗрдЯред рдпрд╛рдиреА рдиреЗрдЯреНрдЯреА, рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рднреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред

рдХреБрд▓реАрдирддрд╛ рдХреИрд╕реЗ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧреА?


рдиреЗрдЯреНрдЯреА рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рдЗрдирдкреБрдЯ рд╣реИрдВрдбрд▓рд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╛рдиреА рдкрд╣рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкреИрдХреЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрди рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЖрдк рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдпрд╛ рдореЗрдореЛрд░реА рдЖрджрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдиреЗрдЯреНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:

Piccy.info - рдлреНрд░реА рдЗрдореЗрдЬ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ

рд╣рдореЗрдВ 3 рд╣реИрдВрдбрд▓рд░ рдорд┐рд▓рддреЗ рд╣реИрдВ:
1. рдХрдиреЗрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ рдЬреЛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ (рдХрд╛рд▓реА рд╕реВрдЪреА, рд╢реНрд╡реЗрддрд╕реВрдЪреА, рдЖрдИрдкреА рдлрд╝рд┐рд▓реНрдЯрд░ рдЖрджрд┐) рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

2. рдлрд╝реНрд░реЗрдо рд╣реИрдВрдбрд▓рд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрдХреЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреИрдХреЗрдЬ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реИрдВред 1-рд╣реИрдбрд░, рдЬреЛ рдкреИрдХреЗрдЯ рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ 2-рд╕реАрдзреЗ рдкреИрдХреЗрдЯ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

3. рдкреИрдХреЗрдЯ рд╣реИрдВрдбрд▓рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЗрдо рдореИрд╕реЗрдЬ рд╣реИрдВрдбрд▓рд░ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдкреИрдХреЗрдЬ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗред

рдХреЛрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред

рдХрдиреЗрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░

public class ConnectionHandler extends SimpleChannelHandler
{

    @Override
    public void channelOpen( ChannelHandlerContext ctx, ChannelStateEvent e ) throws Exception
    {
        if(       )
        {
	//  
            e.getChannel().close();
        }
    }
    
    @Override
    public void channelClosed( ChannelHandlerContext ctx, ChannelStateEvent e ) throws Exception
    {
        // ,   ,        .
    }
  
    
    @Override
    public void exceptionCaught( ChannelHandlerContext ctx, ExceptionEvent e ) throws Exception
    {
	//   
        log.error( "message: {}", e.getCause().getMessage() );
    }    
    
}


Frame handler.

. , .
public class FrameHandler extends ReplayingDecoder<DecoderState>
{
    public enum DecoderState
    {
        READ_LENGTH,
        READ_CONTENT;
    }  

    private int length;

    public ProtocolPacketFramer()
    {
        super( DecoderState.READ_LENGTH );
    }
    
    @Override
    protected Object decode( ChannelHandlerContext chc, Channel chnl, ChannelBuffer cb, DecoderState state ) throws Exception
    {
        switch ( state )
        {
            case READ_LENGTH:
                length = cb.readInt();
                checkpoint( DecoderState.READ_CONTENT );
                
            case READ_CONTENT:
                ChannelBuffer frame = cb.readBytes( length );
                checkpoint( DecoderState.READ_LENGTH );
                return frame;
                
            default:
                throw new Error( "Shouldn't reach here." );
        }
    }
}


Packet handler

public class ProtocolPacketHandler extends SimpleChannelHandler
{
    @Override
    public void messageReceived( ChannelHandlerContext ctx, MessageEvent e ) throws Exception
    {
	//  
            byte[] msg = ((ChannelBuffer)e.getMessage()).array();
            
	//     
            Packet packet = new Packet();
            packet.setData( msg );
            packet.setSender( session );

	//      
            session.addReadPacketQueue( packet );

	//      
            Server.getReader().addSessionToProcess( session );
    }
}


, . Packet . .

. . , , . . 2 . TCP , . . , . .
, TCP ( Akka ) . . TCP Netty , .

.

Piccy.info - Free Image Hosting

. . TCP Netty . .

. Session , 2 , . Packet . Netty , . , . . . . тАж - )) , , .

.
Piccy.info - Free Image Hosting

.


public final class ReadQueueHandler implements Runnable
{
    private final BlockingQueue<Session> sessionQueue;
    private final ExecutorService        threadPool;
    private int                          threadPoolSize;
    
    public ReadQueueHandler( int threadPoolSize )
    {
        this.threadPoolSize = threadPoolSize;
        this.threadPool     = Executors.newFixedThreadPool( threadPoolSize );
        this.sessionQueue   = new LinkedBlockingQueue();
        
        initThreadPool();
    }
    
    private void initThreadPool()
    {
        for ( int i = 0; i < this.threadPoolSize; i++ )
        {
            this.threadPool.execute( this );
        }
    }
    
    //      
    public void addSessionToProcess( Session session )
    {
        if ( session != null )
        {
            this.sessionQueue.add( session );
        }
    }    
    
    @Override
    public void run()
    {
        while ( isActive )
        {
                //     
                Session session = (Session) this.sessionQueue.take();
                
                //     
                //  
                packet = session.getReadPacketQueue().take();

                //       
                data =  packet.getData();
        }
    }    
}


. . . TCP . . Netty . .

protobuf. . , )

, AMD 1.4 (lenovo edge 13), 18-20 . .

P.S. тАФ .

Source: https://habr.com/ru/post/In136765/


All Articles