package org.apache.haox.transport.tcp; import org.apache.haox.event.Event; import org.apache.haox.event.EventType; import org.apache.haox.transport.Transport; import org.apache.haox.transport.event.TransportEventType; import org.apache.haox.transport.TransportHandler; import org.apache.haox.transport.event.TransportEvent; import java.io.IOException; import java.nio.channels.SelectionKey; public class TcpTransportHandler extends TransportHandler { private StreamingDecoder streamingDecoder; public TcpTransportHandler(StreamingDecoder streamingDecoder) { this.streamingDecoder = streamingDecoder; } public StreamingDecoder getStreamingDecoder() { return streamingDecoder; } @Override public EventType[] getInterestedEvents() { return new TransportEventType[] { TransportEventType.TRANSPORT_READABLE, TransportEventType.TRANSPORT_WRITABLE }; } @Override protected void doHandle(Event event) throws Exception { EventType eventType = event.getEventType(); TransportEvent te = (TransportEvent) event; Transport transport = te.getTransport(); if (eventType == TransportEventType.TRANSPORT_READABLE) { transport.onReadable(); } else if (eventType == TransportEventType.TRANSPORT_WRITABLE) { transport.onWriteable(); } } @Override public void helpHandleSelectionKey(SelectionKey selectionKey) throws IOException { if (selectionKey.isReadable()) { selectionKey.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE); TcpTransport transport = (TcpTransport) selectionKey.attachment(); dispatch(TransportEvent.createReadableTransportEvent(transport)); } else if (selectionKey.isWritable()) { selectionKey.interestOps(SelectionKey.OP_READ); TcpTransport transport = (TcpTransport) selectionKey.attachment(); dispatch(TransportEvent.createWritableTransportEvent(transport)); } } }