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

рд╣рдореЗрдВ 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 , .
.

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

.
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. тАФ .