add ChannelUtil

This commit is contained in:
Looly 2022-05-23 11:32:50 +08:00
parent 2953b27dbc
commit 5698f1ecd4
4 changed files with 77 additions and 29 deletions

View File

@ -9,6 +9,7 @@
* 【core 】 BeanUtil拷贝对象增加空检查issue#I58CJ3@Gitee
* 【db 】 Column#size改为long
* 【core 】 ClassUtil增加isInterface等方法pr#623@Gitee
* 【socket 】 增加ChannelUtil
*
### 🐞Bug修复
* 【extra 】 修复SshjSftp初始化未能代入端口配置问题issue#2333@Github

View File

@ -0,0 +1,62 @@
package cn.hutool.socket;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;
/**
* Channel相关封装
*
* @author looly
* @since 5.8.2
*/
public class ChannelUtil {
/**
* 创建{@link AsynchronousChannelGroup}
*
* @param poolSize 线程池大小
* @return {@link AsynchronousChannelGroup}
*/
public static AsynchronousChannelGroup createFixedGroup(int poolSize) {
try {
return AsynchronousChannelGroup.withFixedThreadPool(//
poolSize, // 默认线程池大小
ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()//
);
} catch (IOException e) {
throw new IORuntimeException(e);
}
}
/**
* 连接到指定地址
*
* @param group {@link AsynchronousChannelGroup}
* @param address 地址信息包括地址和端口
* @return {@link AsynchronousSocketChannel}
*/
public static AsynchronousSocketChannel connect(AsynchronousChannelGroup group, InetSocketAddress address) {
AsynchronousSocketChannel channel;
try {
channel = AsynchronousSocketChannel.open(group);
} catch (IOException e) {
throw new IORuntimeException(e);
}
try {
channel.connect(address).get();
} catch (InterruptedException | ExecutionException e) {
IoUtil.close(channel);
throw new SocketRuntimeException(e);
}
return channel;
}
}

View File

@ -1,19 +1,14 @@
package cn.hutool.socket.aio;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import cn.hutool.socket.ChannelUtil;
import cn.hutool.socket.SocketConfig;
import cn.hutool.socket.SocketRuntimeException;
import java.io.Closeable;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketOption;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;
/**
* Aio Socket客户端
@ -120,25 +115,7 @@ public class AioClient implements Closeable{
* @return this
*/
private static AsynchronousSocketChannel createChannel(InetSocketAddress address, int poolSize) {
AsynchronousSocketChannel channel;
try {
AsynchronousChannelGroup group = AsynchronousChannelGroup.withFixedThreadPool(//
poolSize, // 默认线程池大小
ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()//
);
channel = AsynchronousSocketChannel.open(group);
} catch (IOException e) {
throw new IORuntimeException(e);
}
try {
channel.connect(address).get();
} catch (InterruptedException | ExecutionException e) {
IoUtil.close(channel);
throw new SocketRuntimeException(e);
}
return channel;
return ChannelUtil.connect(ChannelUtil.createFixedGroup(poolSize), address);
}
// ------------------------------------------------------------------------------------- Private method end
}

View File

@ -1,13 +1,21 @@
package cn.hutool.socket.aio;
import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import cn.hutool.core.util.StrUtil;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousChannelGroup;
public class AioClientTest {
public static void main(String[] args) {
public static void main(String[] args) throws IOException {
final AsynchronousChannelGroup GROUP = AsynchronousChannelGroup.withFixedThreadPool(//
Runtime.getRuntime().availableProcessors(), // 默认线程池大小
ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()//
);
AioClient client = new AioClient(new InetSocketAddress("localhost", 8899), new SimpleIoAction() {
@Override