Add the hello world HTTP server example to compare the performance against Netty 4
This commit is contained in:
parent
a512c099ca
commit
34a21d3c35
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 The Netty Project
|
||||||
|
*
|
||||||
|
* The Netty Project licenses this file to you under the Apache License,
|
||||||
|
* version 2.0 (the "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.jboss.netty.example.http.helloworld;
|
||||||
|
|
||||||
|
import org.jboss.netty.bootstrap.ServerBootstrap;
|
||||||
|
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An HTTP server that sends back the content of the received HTTP request
|
||||||
|
* in a pretty plaintext form.
|
||||||
|
*/
|
||||||
|
public class HttpHelloWorldServer {
|
||||||
|
|
||||||
|
private final int port;
|
||||||
|
|
||||||
|
public HttpHelloWorldServer(int port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
// Configure the server.
|
||||||
|
ServerBootstrap bootstrap = new ServerBootstrap(
|
||||||
|
new NioServerSocketChannelFactory(
|
||||||
|
Executors.newCachedThreadPool(),
|
||||||
|
Executors.newCachedThreadPool()));
|
||||||
|
|
||||||
|
// Enable TCP_NODELAY to handle pipelined requests without latency.
|
||||||
|
bootstrap.setOption("child.tcpNoDelay", true);
|
||||||
|
|
||||||
|
// Set up the event pipeline factory.
|
||||||
|
bootstrap.setPipelineFactory(new HttpHelloWorldServerPipelineFactory());
|
||||||
|
|
||||||
|
// Bind and start to accept incoming connections.
|
||||||
|
bootstrap.bind(new InetSocketAddress(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int port;
|
||||||
|
if (args.length > 0) {
|
||||||
|
port = Integer.parseInt(args[0]);
|
||||||
|
} else {
|
||||||
|
port = 8080;
|
||||||
|
}
|
||||||
|
new HttpHelloWorldServer(port).run();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 The Netty Project
|
||||||
|
*
|
||||||
|
* The Netty Project licenses this file to you under the Apache License,
|
||||||
|
* version 2.0 (the "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.jboss.netty.example.http.helloworld;
|
||||||
|
|
||||||
|
import org.jboss.netty.buffer.ChannelBuffers;
|
||||||
|
import org.jboss.netty.channel.Channel;
|
||||||
|
import org.jboss.netty.channel.ChannelFuture;
|
||||||
|
import org.jboss.netty.channel.ChannelFutureListener;
|
||||||
|
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||||
|
import org.jboss.netty.channel.Channels;
|
||||||
|
import org.jboss.netty.channel.ExceptionEvent;
|
||||||
|
import org.jboss.netty.channel.MessageEvent;
|
||||||
|
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
|
||||||
|
import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpRequest;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpResponse;
|
||||||
|
import org.jboss.netty.util.CharsetUtil;
|
||||||
|
|
||||||
|
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.*;
|
||||||
|
import static org.jboss.netty.handler.codec.http.HttpHeaders.*;
|
||||||
|
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.*;
|
||||||
|
import static org.jboss.netty.handler.codec.http.HttpVersion.*;
|
||||||
|
|
||||||
|
public class HttpHelloWorldServerHandler extends SimpleChannelUpstreamHandler {
|
||||||
|
|
||||||
|
private static final byte[] CONTENT = "Hello World".getBytes(CharsetUtil.US_ASCII);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
||||||
|
Object msg = e.getMessage();
|
||||||
|
Channel ch = e.getChannel();
|
||||||
|
if (msg instanceof HttpRequest) {
|
||||||
|
HttpRequest req = (HttpRequest) msg;
|
||||||
|
|
||||||
|
if (is100ContinueExpected(req)) {
|
||||||
|
Channels.write(ctx, Channels.future(ch), new DefaultHttpResponse(HTTP_1_1, CONTINUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean keepAlive = isKeepAlive(req);
|
||||||
|
HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
|
||||||
|
response.setContent(ChannelBuffers.wrappedBuffer(CONTENT));
|
||||||
|
response.setHeader(CONTENT_TYPE, "text/plain");
|
||||||
|
response.setHeader(CONTENT_LENGTH, response.getContent().readableBytes());
|
||||||
|
|
||||||
|
if (!keepAlive) {
|
||||||
|
ChannelFuture f = Channels.future(ch);
|
||||||
|
f.addListener(ChannelFutureListener.CLOSE);
|
||||||
|
Channels.write(ctx, f, response);
|
||||||
|
} else {
|
||||||
|
response.setHeader(CONNECTION, Values.KEEP_ALIVE);
|
||||||
|
Channels.write(ctx, Channels.future(ch), response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
|
||||||
|
throws Exception {
|
||||||
|
e.getCause().printStackTrace();
|
||||||
|
e.getChannel().close();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 The Netty Project
|
||||||
|
*
|
||||||
|
* The Netty Project licenses this file to you under the Apache License,
|
||||||
|
* version 2.0 (the "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.jboss.netty.example.http.helloworld;
|
||||||
|
|
||||||
|
import org.jboss.netty.channel.ChannelPipeline;
|
||||||
|
import org.jboss.netty.channel.ChannelPipelineFactory;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpContentCompressor;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
|
||||||
|
|
||||||
|
import static org.jboss.netty.channel.Channels.*;
|
||||||
|
|
||||||
|
public class HttpHelloWorldServerPipelineFactory implements ChannelPipelineFactory {
|
||||||
|
public ChannelPipeline getPipeline() throws Exception {
|
||||||
|
// Create a default pipeline implementation.
|
||||||
|
ChannelPipeline pipeline = pipeline();
|
||||||
|
|
||||||
|
// Uncomment the following line if you want HTTPS
|
||||||
|
//SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine();
|
||||||
|
//engine.setUseClientMode(false);
|
||||||
|
//pipeline.addLast("ssl", new SslHandler(engine));
|
||||||
|
|
||||||
|
pipeline.addLast("decoder", new HttpRequestDecoder());
|
||||||
|
// Uncomment the following line if you don't want to handle HttpChunks.
|
||||||
|
//pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
|
||||||
|
pipeline.addLast("encoder", new HttpResponseEncoder());
|
||||||
|
// Remove the following line if you don't want automatic content compression.
|
||||||
|
pipeline.addLast("deflater", new HttpContentCompressor());
|
||||||
|
pipeline.addLast("handler", new HttpHelloWorldServerHandler());
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user