SimpleChannelHandlerテキストレベルの通信を確立

3179 ワード

初心者はnettyでテキストレベルの通信に適しており、誤り訂正が簡単で、デバッグ速度が速い.

public class ServerHandler extends SimpleChannelHandler {

SimpleChannelHandlerから継承され、このスタートは比較的容易です.

    public void channelConnected(
            ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        // Send greeting for a new connection.
		e.getChannel().write("welcome
"); } public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception { // Log all channel state changes. if (e instanceof ChannelStateEvent) { logger.debug("Channel state changed: " + e); } super.handleUpstream(ctx, e); } public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception { // Log all channel state changes. if (e instanceof MessageEvent) { logger.debug("Writing:: " + e); } super.handleDownstream(ctx, e); }

channelConnectedは連続的な挨拶をしなければならないわけではありません.
handleUpstreamとhandleDownstreamは現在、変化を記録しているだけで、具体的な詳細をよりよく見ることができ、実際にはしていません.

	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
		// Send back the received message to the remote peer.
		Object msg = e.getMessage();
		logger.debug("e.getMessage():"+msg+" class:"+msg.getClass());
		e.getChannel().write("echo:"+msg);
		e.getChannel().close();
	}

MessageReceivedは,情報処理を受信して返す主関数であり,現在はechoを加えて返すだけである.

public class Server {

    private static final int SERVER_PORT = 10000;

	public static void main(String[] args) throws Exception {
        // Configure the server.
        ServerBootstrap bootstrap = new ServerBootstrap(
                new NioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                        Executors.newCachedThreadPool()));

        // Set up the default event pipeline.
        ServerHandler handler = new ServerHandler();
        ChannelPipeline pipeline = bootstrap.getPipeline();
		pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));
        pipeline.addLast("stringDecoder", new StringDecoder("UTF-8"));
        pipeline.addLast("stringEncoder", new StringEncoder("UTF-8"));
		pipeline.addLast("handler", handler);

        // Bind and start to accept incoming connections.
        bootstrap.bind(new InetSocketAddress(SERVER_PORT));

    }
}

もう一つサーバーを起動すればいいです.注意pipelineに付けられているものは、frameDecoderは改行文字で処理され、行為単位で処理されます.stringDecoderとstringEncoderは,いずれも伝送内容を文字列として扱う.
bootstrap.bindはポートを傍受するために使用されます.
クライアント送信の際に加算することに注意してください.サービス側にframeDecoderを付けて改行で終わるので、付けないのは未終了とみなされます.