客户端
package com.mchz.netty.test.client;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
/**
* Sends one message when a connection is open and echoes back any received data
* to the server. Simply put, the echo client initiates the ping-pong traffic
* between the echo client and server by sending the first message to the
* server.
*/
public class EchoClient extends Thread {
private final String host;
private final int port;
private final int firstMessageSize;
private Integer recyle = 5;
public EchoClient(String host, int port, int firstMessageSize,
String threadName) {
this.host = host;
this.port = port;
this.firstMessageSize = firstMessageSize;
System.out.println("current thread name is ====" + threadName);
this.start();
}
public void run() {
ClientBootstrap bootstrap = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(new EchoClientHandler(
firstMessageSize, recyle));
}
});
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,
port));
future.getChannel().getCloseFuture().awaitUninterruptibly();
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.releaseExternalResources();
}
public static void main(String[] args) throws Exception {
int i = 1;
while (true) {
i++;
// new EchoClient("172.16.4.123", 8080, 256, "thread=" + i);
new EchoClient("127.0.0.1", 8080, 256, "thread=" + i);
if (i > 3) {
break;
}
}
Thread.sleep(1000 * 200);
System.out.println("end....");
}
}
package com.mchz.netty.test.client;
import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
/**
* Handler implementation for the echo client. It initiates the ping-pong
* traffic between the echo client and server by sending the first message to
* the server.
*/
public class EchoClientHandler extends SimpleChannelUpstreamHandler {
private static final Logger logger = Logger
.getLogger(EchoClientHandler.class.getName());
private Integer recyle=5;
private final ChannelBuffer firstMessage;
private final AtomicLong transferredBytes = new AtomicLong();
/**
* Creates a client-side handler.
*/
public EchoClientHandler(int firstMessageSize,Integer recyle) {
this.recyle=recyle;
if (firstMessageSize <= 0) {
throw new IllegalArgumentException("firstMessageSize: "
+ firstMessageSize);
}
firstMessage = ChannelBuffers.buffer(firstMessageSize);
for (int i = 0; i < firstMessage.capacity(); i++) {
firstMessage.writeByte((byte) i);
}
}
public long getTransferredBytes() {
return transferredBytes.get();
}
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
for (int i = 0; i < recyle; i++) {
try {
System.out.println("send a message to server ...");
e.getChannel().write(firstMessage);
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
// Close the connection when an exception is raised.
System.out.println("close the connection when an exception is raised");
logger.log(Level.WARNING, "Unexpected exception from downstream.",
e.getCause());
e.getChannel().close();
}
}
服务端
package com.mchz.netty.test.server;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
/**
* Echoes back any received data from a client.
*/
public class EchoServer {
private final int port;
public EchoServer(int port) {
this.port = port;
}
public void run() {
// Configure the server.
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
ChannelPipelineFactory pipelineFactory = new MyPipelineFactory(
new EchoServerHandler());
bootstrap.setPipelineFactory(pipelineFactory);
// bootstrap.setOption("allIdleTime", "10");
bootstrap.bind(new InetSocketAddress(port));
}
public static void main(String[] args) throws Exception {
int port;
if (args.length > 0) {
port = Integer.parseInt(args[0]);
} else {
port = 8080;
}
new EchoServer(port).run();
}
}
package com.mchz.netty.test.server;
import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.timeout.IdleState;
import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler;
import org.jboss.netty.handler.timeout.IdleStateEvent;
/**
* Handler implementation for the echo server.
*/
public class EchoServerHandler extends IdleStateAwareChannelHandler {
private static final Logger logger = Logger
.getLogger(EchoServerHandler.class.getName());
private final AtomicLong transferredBytes = new AtomicLong();
public long getTransferredBytes() {
return transferredBytes.get();
}
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
throws Exception {
System.out.println("server has been connected");
super.channelConnected(ctx, e);
}
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
// Send back the received message to the remote peer.
transferredBytes.addAndGet(((ChannelBuffer) e.getMessage())
.readableBytes());
System.out
.println("I an server ,I received a message,and I will received a message after 5 mill later");
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e1) {
// e1.printStackTrace();
// }
// e.getChannel().write(e.getMessage());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
// Close the connection when an exception is raised.
System.out.println(" Close the connection when an exception is raised"+e.getCause().getMessage());
logger.log(Level.WARNING, "Unexpected exception from downstream.",
e.getCause());
e.getChannel().close();
}
@Override
public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e)
throws Exception {
// super.channelIdle(ctx, e);
if( e.getState() == IdleState.ALL_IDLE){
e.getChannel().write("str123".getBytes());
super.channelIdle(ctx, e);
}
}
}
package com.mchz.netty.test.server;
import org.jboss.netty.channel.ChannelHandler;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.handler.timeout.ReadTimeoutHandler;
import org.jboss.netty.util.HashedWheelTimer;
import org.jboss.netty.util.Timer;
public class MyPipelineFactory implements ChannelPipelineFactory {
private ChannelHandler serverHandler;
public MyPipelineFactory(ChannelHandler serverHander) {
this.serverHandler = serverHander;
}
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
Timer timer = new HashedWheelTimer();
pipeline.addLast("timeout", new ReadTimeoutHandler(timer, 10));
pipeline.addLast("idleHandler", serverHandler);
return pipeline;
}
}