6 changed files with 337 additions and 0 deletions
-
65src/main/java/com/corundumstudio/socketio/demo/discard/DiscardServer.java
-
46src/main/java/com/corundumstudio/socketio/demo/discard/DiscardServerHandler.java
-
49src/main/java/com/corundumstudio/socketio/demo/time/TimeClient.java
-
68src/main/java/com/corundumstudio/socketio/demo/time/TimeClientHandler.java
-
65src/main/java/com/corundumstudio/socketio/demo/time/TimeServer.java
-
44src/main/java/com/corundumstudio/socketio/demo/time/TimeServerHandler.java
@ -0,0 +1,65 @@ |
|||||
|
package com.corundumstudio.socketio.demo.discard; |
||||
|
|
||||
|
import io.netty.bootstrap.ServerBootstrap; |
||||
|
|
||||
|
import io.netty.channel.ChannelFuture; |
||||
|
import io.netty.channel.ChannelInitializer; |
||||
|
import io.netty.channel.ChannelOption; |
||||
|
import io.netty.channel.EventLoopGroup; |
||||
|
import io.netty.channel.nio.NioEventLoopGroup; |
||||
|
import io.netty.channel.socket.SocketChannel; |
||||
|
import io.netty.channel.socket.nio.NioServerSocketChannel; |
||||
|
|
||||
|
/** |
||||
|
* TODO : |
||||
|
* |
||||
|
* @author ye.jf |
||||
|
* @version 0.1.0 |
||||
|
* @date 2022/1/1 14:18 |
||||
|
* @copyright Wonhigh Information Technology (Shenzhen) Co.,Ltd. |
||||
|
*/ |
||||
|
public class DiscardServer { |
||||
|
private int port; |
||||
|
|
||||
|
public DiscardServer(int port) { |
||||
|
this.port = port; |
||||
|
} |
||||
|
|
||||
|
public void run() throws Exception { |
||||
|
EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1) |
||||
|
EventLoopGroup workerGroup = new NioEventLoopGroup(); |
||||
|
try { |
||||
|
ServerBootstrap b = new ServerBootstrap(); // (2) |
||||
|
b.group(bossGroup, workerGroup) |
||||
|
.channel(NioServerSocketChannel.class) // (3) |
||||
|
.childHandler(new ChannelInitializer<SocketChannel>() { // (4) |
||||
|
@Override |
||||
|
public void initChannel(SocketChannel ch) throws Exception { |
||||
|
ch.pipeline().addLast(new DiscardServerHandler()); |
||||
|
} |
||||
|
}) |
||||
|
.option(ChannelOption.SO_BACKLOG, 128) // (5) |
||||
|
.childOption(ChannelOption.SO_KEEPALIVE, true); // (6) |
||||
|
|
||||
|
// Bind and start to accept incoming connections. |
||||
|
ChannelFuture f = b.bind(port).sync(); // (7) |
||||
|
|
||||
|
// Wait until the server socket is closed. |
||||
|
// In this example, this does not happen, but you can do that to gracefully |
||||
|
// shut down your server. |
||||
|
f.channel().closeFuture().sync(); |
||||
|
} finally { |
||||
|
workerGroup.shutdownGracefully(); |
||||
|
bossGroup.shutdownGracefully(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static void main(String[] args) throws Exception { |
||||
|
int port = 8080; |
||||
|
if (args.length > 0) { |
||||
|
port = Integer.parseInt(args[0]); |
||||
|
} |
||||
|
|
||||
|
new DiscardServer(port).run(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,46 @@ |
|||||
|
package com.corundumstudio.socketio.demo.discard; |
||||
|
|
||||
|
import io.netty.buffer.ByteBuf; |
||||
|
|
||||
|
import io.netty.channel.ChannelHandlerContext; |
||||
|
import io.netty.channel.ChannelInboundHandlerAdapter; |
||||
|
import io.netty.util.ReferenceCountUtil; |
||||
|
|
||||
|
/** |
||||
|
* TODO : |
||||
|
* |
||||
|
* @author ye.jf |
||||
|
* @version 0.1.0 |
||||
|
* @date 2022/1/1 12:33 |
||||
|
* @copyright Wonhigh Information Technology (Shenzhen) Co.,Ltd. |
||||
|
*/ |
||||
|
public class DiscardServerHandler extends ChannelInboundHandlerAdapter { |
||||
|
@Override |
||||
|
public void channelRead(ChannelHandlerContext ctx, Object msg) { // (2) |
||||
|
// Discard the received data silently. |
||||
|
System.out.println("DiscardServerHandler channelRead"); |
||||
|
/*ByteBuf in = (ByteBuf) msg; |
||||
|
try { |
||||
|
// 丢弃协议实现 |
||||
|
while (in.isReadable()) { // (1) |
||||
|
System.out.print((char) in.readByte()); |
||||
|
System.out.flush(); |
||||
|
} |
||||
|
} finally { |
||||
|
ReferenceCountUtil.release(msg); |
||||
|
}*/ |
||||
|
// 响应服务实现 |
||||
|
ctx.write(msg); // (1) |
||||
|
ctx.flush(); // (2) |
||||
|
|
||||
|
//ctx.writeAndFlush(msg); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4) |
||||
|
// Close the connection when an exception is raised. |
||||
|
cause.printStackTrace(); |
||||
|
ctx.close(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,49 @@ |
|||||
|
package com.corundumstudio.socketio.demo.time; |
||||
|
|
||||
|
import io.netty.bootstrap.Bootstrap; |
||||
|
import io.netty.channel.ChannelFuture; |
||||
|
import io.netty.channel.ChannelInitializer; |
||||
|
import io.netty.channel.ChannelOption; |
||||
|
import io.netty.channel.EventLoopGroup; |
||||
|
import io.netty.channel.nio.NioEventLoopGroup; |
||||
|
import io.netty.channel.socket.SocketChannel; |
||||
|
import io.netty.channel.socket.nio.NioSocketChannel; |
||||
|
|
||||
|
/** |
||||
|
* TODO : |
||||
|
* |
||||
|
* @author ye.jf |
||||
|
* @version 0.1.0 |
||||
|
* @date 2022/1/3 13:54 |
||||
|
* @copyright Wonhigh Information Technology (Shenzhen) Co.,Ltd. |
||||
|
*/ |
||||
|
public class TimeClient { |
||||
|
public static void main(String[] args) throws Exception { |
||||
|
//String host = args[0]; |
||||
|
//int port = Integer.parseInt(args[1]); |
||||
|
String host = "localhost"; |
||||
|
int port = 8080; |
||||
|
EventLoopGroup workerGroup = new NioEventLoopGroup(); |
||||
|
|
||||
|
try { |
||||
|
Bootstrap b = new Bootstrap(); // (1) |
||||
|
b.group(workerGroup); // (2) |
||||
|
b.channel(NioSocketChannel.class); // (3) |
||||
|
b.option(ChannelOption.SO_KEEPALIVE, true); // (4) |
||||
|
b.handler(new ChannelInitializer<SocketChannel>() { |
||||
|
@Override |
||||
|
public void initChannel(SocketChannel ch) throws Exception { |
||||
|
ch.pipeline().addLast(new TimeClientHandler()); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// Start the client. |
||||
|
ChannelFuture f = b.connect(host, port).sync(); // (5) |
||||
|
|
||||
|
// Wait until the connection is closed. |
||||
|
f.channel().closeFuture().sync(); |
||||
|
} finally { |
||||
|
workerGroup.shutdownGracefully(); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,68 @@ |
|||||
|
package com.corundumstudio.socketio.demo.time; |
||||
|
|
||||
|
import io.netty.buffer.ByteBuf; |
||||
|
import io.netty.channel.ChannelHandlerContext; |
||||
|
import io.netty.channel.ChannelInboundHandlerAdapter; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
|
||||
|
/** |
||||
|
* TODO : |
||||
|
* |
||||
|
* @author ye.jf |
||||
|
* @version 0.1.0 |
||||
|
* @date 2022/1/3 14:04 |
||||
|
* @copyright Wonhigh Information Technology (Shenzhen) Co.,Ltd. |
||||
|
*/ |
||||
|
public class TimeClientHandler extends ChannelInboundHandlerAdapter { |
||||
|
/** |
||||
|
* 以下这种实现方案有可能出现越界异常,并且在处理大数据量时,会出现数据碎片化 例如 发送方三个数据包 abc def ghi, 接收时变成 ab cdefg h i |
||||
|
* |
||||
|
* 简单的解决方案是创建一个内部累积缓冲区,并等待直到所有4个字节都被接收到内部缓冲区。 |
||||
|
* @param ctx |
||||
|
* @param msg |
||||
|
*/ |
||||
|
/*@Override |
||||
|
public void channelRead(ChannelHandlerContext ctx, Object msg) { |
||||
|
ByteBuf m = (ByteBuf) msg; // (1) |
||||
|
try { |
||||
|
long currentTimeMillis = (m.readUnsignedInt() - 2208988800L) * 1000L; |
||||
|
System.out.println(new Date(currentTimeMillis)); |
||||
|
ctx.close(); |
||||
|
} finally { |
||||
|
m.release(); |
||||
|
} |
||||
|
}*/ |
||||
|
|
||||
|
private ByteBuf buf; |
||||
|
|
||||
|
@Override |
||||
|
public void handlerAdded(ChannelHandlerContext ctx) { |
||||
|
buf = ctx.alloc().buffer(4); // (1) |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handlerRemoved(ChannelHandlerContext ctx) { |
||||
|
buf.release(); // (1) |
||||
|
buf = null; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void channelRead(ChannelHandlerContext ctx, Object msg) { |
||||
|
ByteBuf m = (ByteBuf) msg; |
||||
|
buf.writeBytes(m); // (2) |
||||
|
m.release(); |
||||
|
|
||||
|
if (buf.readableBytes() >= 4) { // (3) |
||||
|
long currentTimeMillis = (buf.readUnsignedInt() - 2208988800L) * 1000L; |
||||
|
System.out.println(new Date(currentTimeMillis)); |
||||
|
ctx.close(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { |
||||
|
cause.printStackTrace(); |
||||
|
ctx.close(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,65 @@ |
|||||
|
package com.corundumstudio.socketio.demo.time; |
||||
|
|
||||
|
import com.corundumstudio.socketio.demo.discard.DiscardServerHandler; |
||||
|
import io.netty.bootstrap.ServerBootstrap; |
||||
|
import io.netty.channel.ChannelFuture; |
||||
|
import io.netty.channel.ChannelInitializer; |
||||
|
import io.netty.channel.ChannelOption; |
||||
|
import io.netty.channel.EventLoopGroup; |
||||
|
import io.netty.channel.nio.NioEventLoopGroup; |
||||
|
import io.netty.channel.socket.SocketChannel; |
||||
|
import io.netty.channel.socket.nio.NioServerSocketChannel; |
||||
|
|
||||
|
/** |
||||
|
* TODO : |
||||
|
* |
||||
|
* @author ye.jf |
||||
|
* @version 0.1.0 |
||||
|
* @date 2022/1/1 14:18 |
||||
|
* @copyright Wonhigh Information Technology (Shenzhen) Co.,Ltd. |
||||
|
*/ |
||||
|
public class TimeServer { |
||||
|
private int port; |
||||
|
|
||||
|
public TimeServer(int port) { |
||||
|
this.port = port; |
||||
|
} |
||||
|
|
||||
|
public void run() throws Exception { |
||||
|
EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1) |
||||
|
EventLoopGroup workerGroup = new NioEventLoopGroup(); |
||||
|
try { |
||||
|
ServerBootstrap b = new ServerBootstrap(); // (2) |
||||
|
b.group(bossGroup, workerGroup) |
||||
|
.channel(NioServerSocketChannel.class) // (3) |
||||
|
.childHandler(new ChannelInitializer<SocketChannel>() { // (4) |
||||
|
@Override |
||||
|
public void initChannel(SocketChannel ch) throws Exception { |
||||
|
ch.pipeline().addLast(new TimeServerHandler()); |
||||
|
} |
||||
|
}) |
||||
|
.option(ChannelOption.SO_BACKLOG, 128) // (5) |
||||
|
.childOption(ChannelOption.SO_KEEPALIVE, true); // (6) |
||||
|
|
||||
|
// Bind and start to accept incoming connections. |
||||
|
ChannelFuture f = b.bind(port).sync(); // (7) |
||||
|
|
||||
|
// Wait until the server socket is closed. |
||||
|
// In this example, this does not happen, but you can do that to gracefully |
||||
|
// shut down your server. |
||||
|
f.channel().closeFuture().sync(); |
||||
|
} finally { |
||||
|
workerGroup.shutdownGracefully(); |
||||
|
bossGroup.shutdownGracefully(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static void main(String[] args) throws Exception { |
||||
|
int port = 8080; |
||||
|
if (args.length > 0) { |
||||
|
port = Integer.parseInt(args[0]); |
||||
|
} |
||||
|
|
||||
|
new TimeServer(port).run(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,44 @@ |
|||||
|
package com.corundumstudio.socketio.demo.time; |
||||
|
|
||||
|
import io.netty.buffer.ByteBuf; |
||||
|
import io.netty.channel.ChannelFuture; |
||||
|
import io.netty.channel.ChannelFutureListener; |
||||
|
import io.netty.channel.ChannelHandlerContext; |
||||
|
import io.netty.channel.ChannelInboundHandlerAdapter; |
||||
|
|
||||
|
import java.sql.Time; |
||||
|
|
||||
|
/** |
||||
|
* TODO : |
||||
|
* |
||||
|
* @author ye.jf |
||||
|
* @version 0.1.0 |
||||
|
* @date 2022/1/1 14:55 |
||||
|
* @copyright Wonhigh Information Technology (Shenzhen) Co.,Ltd. |
||||
|
*/ |
||||
|
public class TimeServerHandler extends ChannelInboundHandlerAdapter { |
||||
|
|
||||
|
@Override |
||||
|
public void channelActive(final ChannelHandlerContext ctx) { // (1) |
||||
|
//忽略任何接收到的数据,建立连接后立即返回 |
||||
|
System.out.println("TimeServerHandler channelActive" ); |
||||
|
final ByteBuf time = ctx.alloc().buffer(4); // (2) |
||||
|
time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L)); |
||||
|
|
||||
|
final ChannelFuture f = ctx.writeAndFlush(time); // (3) |
||||
|
f.addListener(new ChannelFutureListener() { |
||||
|
@Override |
||||
|
public void operationComplete(ChannelFuture future) { |
||||
|
assert f == future; |
||||
|
ctx.close(); |
||||
|
} |
||||
|
}); // (4) |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { |
||||
|
cause.printStackTrace(); |
||||
|
ctx.close(); |
||||
|
} |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue