From d5601d23df0d53add31daa3c884df4e45f26bb2d Mon Sep 17 00:00:00 2001 From: tywo45 Date: Tue, 23 Nov 2021 17:33:41 +0800 Subject: [PATCH] update code update code --- src/core/pom.xml | 4 +- .../org/tio/core/ssl/facade/SSLFacade.java | 30 +-- .../org/tio/core/task/DecodeRunnable.java | 6 +- .../org/tio/core/utils/ByteBufferUtils.java | 29 +++ .../java/org/tio/server/ServerTioConfig.java | 1 + .../main/java/org/tio/server/TioServer.java | 64 ------ src/parent/pom.xml | 182 ++++++++++++------ src/utils/pom.xml | 3 +- .../src/main/java/org/tio/utils/SysConst.java | 2 +- src/zoo/flash-policy-server/pom.xml | 3 +- src/zoo/http/client/pom.xml | 3 +- src/zoo/http/common/pom.xml | 3 +- .../java/org/tio/http/common/HeaderName.java | 1 + .../java/org/tio/http/common/HttpConst.java | 2 + .../java/org/tio/http/common/RequestLine.java | 26 +-- src/zoo/http/parent/pom.xml | 3 +- src/zoo/http/server/pom.xml | 3 +- src/zoo/parent/pom.xml | 3 +- src/zoo/webpack/core/pom.xml | 3 +- src/zoo/webpack/parent/pom.xml | 3 +- src/zoo/websocket/client/pom.xml | 2 +- src/zoo/websocket/common/pom.xml | 9 +- src/zoo/websocket/parent/pom.xml | 3 +- src/zoo/websocket/server/pom.xml | 3 +- .../websocket/server/WsServerAioHandler.java | 58 +++++- .../server/handler/IWsMsgHandler.java | 6 +- .../handler/IWsSubProtocolsMsgHandler.java} | 84 +++----- 27 files changed, 292 insertions(+), 247 deletions(-) rename src/zoo/websocket/{common/src/main/java/org/tio/websocket/common/util/Md5.java => server/src/main/java/org/tio/websocket/server/handler/IWsSubProtocolsMsgHandler.java} (87%) diff --git a/src/core/pom.xml b/src/core/pom.xml index 159f42e8..ca9fbbce 100644 --- a/src/core/pom.xml +++ b/src/core/pom.xml @@ -1,3 +1,4 @@ + @@ -8,7 +9,7 @@ org.t-io tio-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml @@ -18,7 +19,6 @@ tio-utils - org.redisson redisson diff --git a/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java b/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java index 754cfa89..293a60ec 100644 --- a/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java +++ b/src/core/src/main/java/org/tio/core/ssl/facade/SSLFacade.java @@ -205,29 +205,21 @@ recommend that a file or class name and description of purpose be included on import org.slf4j.LoggerFactory; import org.tio.core.ChannelContext; import org.tio.core.ssl.SslVo; +import org.tio.core.utils.ByteBufferUtils; -/** - * 一个 - * @author tanyaowu - * - */ public class SSLFacade implements ISSLFacade { @SuppressWarnings("unused") - private static final String TAG = "SSLFascade"; - private static final Logger log = LoggerFactory.getLogger(SSLFacade.class); - + private static final String TAG = "SSLFascade"; + private static final Logger log = LoggerFactory.getLogger(SSLFacade.class); private AtomicLong sslSeq = new AtomicLong(); - - private Handshaker _handshaker; - private IHandshakeCompletedListener _hcl; - private final Worker _worker; - private boolean _clientMode; - private ChannelContext channelContext; + private Handshaker _handshaker; + private IHandshakeCompletedListener _hcl; + private final Worker _worker; + private boolean _clientMode; + private ChannelContext channelContext; public SSLFacade(ChannelContext channelContext, SSLContext context, boolean client, boolean clientAuthRequired, ITaskHandler taskHandler) { this.channelContext = channelContext; - //Currently there is no support for SSL session reuse, - // so no need to take a peerHost or port from the host application final String who = client ? "client" : "server"; SSLEngine engine = makeSSLEngine(context, client, clientAuthRequired); Buffers buffers = new Buffers(engine.getSession(), channelContext); @@ -236,10 +228,6 @@ public SSLFacade(ChannelContext channelContext, SSLContext context, boolean clie _clientMode = client; } - // private void debug(final String message, final String... args) { - // SSLLog.debug(TAG, message, args); - // } - @Override public boolean isClientMode() { return _clientMode; @@ -276,7 +264,7 @@ public void encrypt(SslVo sslVo) throws SSLException { long seq = sslSeq.incrementAndGet(); ByteBuffer src = sslVo.getByteBuffer(); - ByteBuffer[] byteBuffers = org.tio.core.utils.ByteBufferUtils.split(src, 1024 * 8); + ByteBuffer[] byteBuffers = ByteBufferUtils.split(src, 2048); if (byteBuffers == null) { log.debug("{}, 准备, SSL加密{}, 明文:{}", channelContext, channelContext.getId() + "_" + seq, sslVo); SSLEngineResult result = _worker.wrap(sslVo, sslVo.getByteBuffer()); diff --git a/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java b/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java index 03cad164..aa68131e 100644 --- a/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java +++ b/src/core/src/main/java/org/tio/core/task/DecodeRunnable.java @@ -204,7 +204,7 @@ recommend that a file or class name and description of purpose be included on import org.tio.core.ChannelContext.CloseCode; import org.tio.core.Tio; import org.tio.core.TioConfig; -import org.tio.core.exception.AioDecodeException; +import org.tio.core.exception.TioDecodeException; import org.tio.core.intf.Packet; import org.tio.core.stat.ChannelStat; import org.tio.core.stat.IpStat; @@ -346,7 +346,7 @@ public void decode() { int per = readableLength / channelStat.decodeFailCount; if (per < Math.min(channelContext.getReadBufferSize() / 2, 256)) { String str = "连续解码" + channelStat.decodeFailCount + "次都不成功,并且平均每次接收到的数据为" + per + "字节,有慢攻击的嫌疑"; - throw new AioDecodeException(str); + throw new TioDecodeException(str); } } } @@ -413,7 +413,7 @@ public void decode() { channelContext.setPacketNeededLength(null); - if (e instanceof AioDecodeException) { + if (e instanceof TioDecodeException) { List list = tioConfig.ipStats.durationList; if (list != null && list.size() > 0) { try { diff --git a/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java b/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java index 69810f90..0d4794cc 100644 --- a/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java +++ b/src/core/src/main/java/org/tio/core/utils/ByteBufferUtils.java @@ -195,6 +195,7 @@ recommend that a file or class name and description of purpose be included on import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -482,6 +483,34 @@ public static String readString(ByteBuffer buffer, String charset, char endChar, return null; } + /** + * 获取utf-8字符串 + * @param bytes + * @return + * + */ + public static String getUtf8(byte[] bytes) { + return new String(bytes, StandardCharsets.UTF_8); + } + + /** + * 读取byte + * @param buffer + * @return + */ + public static byte read(ByteBuffer buffer) { + return buffer.get(); + } + + /** + * 读取short + * @param buffer + * @return + */ + public static short readShort(ByteBuffer buffer) { + return buffer.getShort(); + } + public static int readUB1(ByteBuffer buffer) { int ret = buffer.get() & 0xff; return ret; diff --git a/src/core/src/main/java/org/tio/server/ServerTioConfig.java b/src/core/src/main/java/org/tio/server/ServerTioConfig.java index 0ac403e6..0c24cb4a 100644 --- a/src/core/src/main/java/org/tio/server/ServerTioConfig.java +++ b/src/core/src/main/java/org/tio/server/ServerTioConfig.java @@ -514,6 +514,7 @@ public void share(ServerTioConfig tioConfig) { this.clientNodes = tioConfig.clientNodes; this.connections = tioConfig.connections; this.groups = tioConfig.groups; + this.groupStat = tioConfig.groupStat; this.users = tioConfig.users; this.tokens = tioConfig.tokens; this.ids = tioConfig.ids; diff --git a/src/core/src/main/java/org/tio/server/TioServer.java b/src/core/src/main/java/org/tio/server/TioServer.java index 81083e29..6025e4d3 100644 --- a/src/core/src/main/java/org/tio/server/TioServer.java +++ b/src/core/src/main/java/org/tio/server/TioServer.java @@ -194,16 +194,12 @@ recommend that a file or class name and description of purpose be included on package org.tio.server; import java.io.IOException; -import java.io.InputStream; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; -import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.StandardSocketOptions; -import java.net.URL; import java.nio.channels.AsynchronousChannelGroup; import java.nio.channels.AsynchronousServerSocketChannel; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -212,7 +208,6 @@ recommend that a file or class name and description of purpose be included on import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tio.core.Node; -import org.tio.utils.IoUtils; import org.tio.utils.SysConst; import org.tio.utils.hutool.DateUtil; import org.tio.utils.hutool.StrUtil; @@ -353,8 +348,6 @@ public void start(String serverIp, int serverPort) throws IOException { } else { System.out.println(printStr); } - - checkLastVersion(); } /** @@ -401,63 +394,6 @@ public boolean stop() { return ret; } - private void checkLastVersion() { - if (checkLastVersion) { - serverTioConfig.groupExecutor.execute(new Runnable() { - @Override - public void run() { - try { - URL url = new URL(SysConst.CHECK_LASTVERSION_URL_1); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.setConnectTimeout(10 * 1000); - connection.connect(); - int responseCode = connection.getResponseCode(); - if (responseCode == HttpURLConnection.HTTP_OK) { - InputStream inputStream = connection.getInputStream(); - String result = IoUtils.streamToString(inputStream); - - connection.disconnect(); - - url = new URL(SysConst.CHECK_LASTVERSION_URL_2 + result); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.setConnectTimeout(10 * 1000); - connection.connect(); - responseCode = connection.getResponseCode(); - if (responseCode == HttpURLConnection.HTTP_OK) { - inputStream = connection.getInputStream(); - result = IoUtils.streamToString(inputStream); - - if (SysConst.TIO_CORE_VERSION.equals(result)) { - log.info("The version you are using is the latest"); - } else { - log.info("t-io latest version:{},your version:{}", result, SysConst.TIO_CORE_VERSION); - //3.6.2.v20200808-RELEASE - String myVersionDateStr = SysConst.TIO_CORE_VERSION.substring(SysConst.TIO_CORE_VERSION.length() - 16, SysConst.TIO_CORE_VERSION.length() - 8); - String latestVersionDateStr = result.substring(result.length() - 16, result.length() - 8); - - SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); - - Date myVersionDate = format.parse(myVersionDateStr); - Date latestVersionDate = format.parse(latestVersionDateStr); - Integer days = DateUtil.daysBetween(myVersionDate, latestVersionDate); - - log.info("You haven't upgraded in {} days", days); - } - } - - connection.disconnect(); - - } - } catch (Exception e) { - // log.error("", e); - } - } - }); - } - } - public boolean isCheckLastVersion() { return checkLastVersion; } diff --git a/src/parent/pom.xml b/src/parent/pom.xml index be132146..6e0b7a5c 100644 --- a/src/parent/pom.xml +++ b/src/parent/pom.xml @@ -1,3 +1,4 @@ + @@ -5,7 +6,7 @@ org.t-io tio-parent pom - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ${project.artifactId} http://maven.apache.org @@ -35,44 +36,44 @@ 3.1.0 - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE UTF-8 UTF-8 true 3.6.0 - 8.0.21 - 1.2.1 - 3.4.5 + 8.0.23 + 1.2.8 + 4.0.3 4.9 1.2.3 1.7.26 1.8 - 4.13 + 4.13.1 4.4 - 2.8.0 - 3.11 + 2.11.0 + 3.12.0 1.15 - 1.20 - 1.2.74 - 7.3.0 - 5.4.4 + 1.21 + 1.2.78 + 7.4.0 + 5.7.15 3.12.2 1.9.4 1.4 - 1.7.2 - 3.13.5 + 1.7.4 + 3.16.3 5.1.6 2.3.2 - 2.8.5 - 3.9.0 + 2.9.0 + 4.1.5.B 3.4.1 - 4.4.13 + 4.4.14 4.5.13 - v20201006 - 2.3.30 + v20211006 + 2.3.31 1.21 - 7.1.1 + 8.3.1 1.0.2 @@ -97,21 +98,22 @@ 4.1-${javacpp.version} 4.0.1-${javacpp.version} - 2.7 + 2.7.9 3.1.0 - 1.10.1 + 1.10.3 6.2.2 4.9.0 - 3.2.12 - 2.7.0 - 3.12.7 + 3.2.25 + 2.8.3 + 3.12.10 2.2.7.RELEASE - 5.6.0 - 5.3.0 + 5.9.0 + 5.8.3 + 5.0.0 @@ -128,11 +130,35 @@ + + org.openjfx + javafx-controls + 18-ea+1 + + + + me.zhyd.oauth + JustAuth + 1.16.5 + + org.mapdb mapdb 3.0.8 + + + cglib + cglib + 3.3.0 + + + org.ow2.asm + asm + 9.2 + + com.github.oshi oshi-core @@ -202,6 +228,14 @@ ${tio.version} + + + org.t-io + tio-clu-server + ${tio.version} + + + org.t-io tio-umeng @@ -223,7 +257,7 @@ commons-net commons-net - 3.7.1 + 3.8.0 @@ -367,7 +401,11 @@ - + + org.apache.logging.log4j + log4j-api + 2.14.1 + @@ -468,7 +506,7 @@ org.json json - 20200518 + 20210307 @@ -491,7 +529,7 @@ org.jsoup jsoup - 1.13.1 + 1.14.3 @@ -503,13 +541,13 @@ com.google.guava guava - 29.0-jre + 31.0.1-jre nl.basjes.parse.useragent yauaa - 5.19 + 6.0 @@ -542,7 +580,7 @@ com.typesafe config - 1.4.0 + 1.4.1 @@ -588,7 +626,7 @@ io.github.classgraph classgraph - 4.8.90 + 4.8.128 com.thoughtworks.paranamer @@ -610,17 +648,17 @@ org.mongodb bson - 4.0.0 + 4.3.1 org.mongodb mongodb-driver-core - 4.0.0 + 4.3.1 org.mongodb mongodb-driver-reactivestreams - 4.0.0 + 4.3.1 @@ -650,17 +688,17 @@ com.aliyun aliyun-java-sdk-core - 3.7.1 + 4.5.25 com.aliyun aliyun-java-sdk-live - 3.6.0 + 3.9.11 com.aliyun.oss aliyun-sdk-oss - 3.1.0 + 3.13.1 @@ -730,13 +768,13 @@ org.apache.curator curator-x-discovery - 5.1.0 + 5.2.0 org.apache.zookeeper zookeeper - 3.6.2 + 3.7.0 @@ -789,13 +827,13 @@ com.esotericsoftware kryo - 5.0.0-RC5 + 5.2.0 io.netty netty-bom - 4.1.50.Final + 4.1.63.Final pom import @@ -819,7 +857,7 @@ com.github.hazendaz htmlcompressor - 1.7.1 + 1.7.2 @@ -860,7 +898,7 @@ io.reactivex.rxjava2 rxjava - 2.2.20 + 2.2.21 @@ -928,13 +966,13 @@ net.coobird thumbnailator - 0.4.12 + 0.4.14 com.lmax disruptor - 3.4.2 + 3.4.4 @@ -943,29 +981,29 @@ 2.5.1 - + net.bytebuddy byte-buddy - 1.10.17 + 1.11.21 io.projectreactor reactor-core - 3.3.10.RELEASE + 3.4.11 com.google.code.gson gson - 2.8.6 + 2.8.8 cn.jpush.api jpush-client - 3.4.7 + 3.5.4 @@ -1043,18 +1081,48 @@ org.webjars webjars-locator-core - 0.46 + 0.48 redis.clients jedis - 3.3.0 + 3.7.0 com.couchbase.client java-client - 3.0.9 + 3.2.0 + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.13.0 + + + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-scratchpad + ${poi.version} + + + fr.opensagres.xdocreport + fr.opensagres.xdocreport.document + 2.0.2 + + + fr.opensagres.xdocreport + org.apache.poi.xwpf.converter.xhtml + 1.0.6 diff --git a/src/utils/pom.xml b/src/utils/pom.xml index 8d83ef21..abd16fa9 100644 --- a/src/utils/pom.xml +++ b/src/utils/pom.xml @@ -1,3 +1,4 @@ + @@ -8,7 +9,7 @@ org.t-io tio-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml diff --git a/src/utils/src/main/java/org/tio/utils/SysConst.java b/src/utils/src/main/java/org/tio/utils/SysConst.java index df917aa5..0b743485 100644 --- a/src/utils/src/main/java/org/tio/utils/SysConst.java +++ b/src/utils/src/main/java/org/tio/utils/SysConst.java @@ -200,7 +200,7 @@ recommend that a file or class name and description of purpose be included on * 2018年7月1日 下午10:51:59 */ public interface SysConst { - String TIO_CORE_VERSION = "3.7.0.v20201010-RELEASE"; + String TIO_CORE_VERSION = "3.7.5.v20211028-RELEASE"; String TIO_URL_GITEE = "https://gitee.com/tywo45/t-io"; String TIO_URL_GITHUB = "https://github.com/tywo45/t-io"; String TIO_URL_SITE = "https://www.tiocloud.com"; diff --git a/src/zoo/flash-policy-server/pom.xml b/src/zoo/flash-policy-server/pom.xml index 7777bd98..a21288ed 100644 --- a/src/zoo/flash-policy-server/pom.xml +++ b/src/zoo/flash-policy-server/pom.xml @@ -1,3 +1,4 @@ + @@ -8,7 +9,7 @@ org.t-io tio-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../../parent/pom.xml diff --git a/src/zoo/http/client/pom.xml b/src/zoo/http/client/pom.xml index 8a076f7c..a6471e03 100644 --- a/src/zoo/http/client/pom.xml +++ b/src/zoo/http/client/pom.xml @@ -1,3 +1,4 @@ + @@ -8,7 +9,7 @@ org.t-io tio-http-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml diff --git a/src/zoo/http/common/pom.xml b/src/zoo/http/common/pom.xml index cbac8514..e134f2ee 100644 --- a/src/zoo/http/common/pom.xml +++ b/src/zoo/http/common/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 @@ -7,7 +8,7 @@ org.t-io tio-http-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml diff --git a/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java b/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java index fb7199dc..48191643 100644 --- a/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java +++ b/src/zoo/http/common/src/main/java/org/tio/http/common/HeaderName.java @@ -232,6 +232,7 @@ public class HeaderName { public static final HeaderName tio_from_cache = new HeaderName(HttpConst.ResponseHeaderKey.tio_from_cache); public static final HeaderName tio_webpack_used_cache = new HeaderName(HttpConst.ResponseHeaderKey.tio_webpack_used_cache); public static final HeaderName Access_Control_Allow_Credentials = new HeaderName(HttpConst.ResponseHeaderKey.Access_Control_Allow_Credentials); + public static final HeaderName Sec_Websocket_Protocol = HeaderName.from(HttpConst.RequestHeaderKey.Sec_Websocket_Protocol); public final String name; diff --git a/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java b/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java index eac9fd2d..28a2f07a 100644 --- a/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java +++ b/src/zoo/http/common/src/main/java/org/tio/http/common/HttpConst.java @@ -255,6 +255,8 @@ public interface RequestHeaderKey { * 值为XMLHttpRequest则为Ajax */ String X_Requested_With = "x-requested-with";//.toLowerCase();//XMLHttpRequest + + String Sec_Websocket_Protocol = "sec-websocket-protocol"; //.toLowerCase(); // websocket 子协议 } // Content-Type: text/html;charset:utf-8; diff --git a/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java b/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java index 81c4805a..eb0d1724 100644 --- a/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java +++ b/src/zoo/http/common/src/main/java/org/tio/http/common/RequestLine.java @@ -232,7 +232,7 @@ public String getPath() { */ public String getPathAndQuery() { if (StrUtil.isNotBlank(queryString)) { - return path + "?" + queryString; + return path + '?' + queryString; } return path; } @@ -327,12 +327,12 @@ public void setInitPath(String initPath) { @Override public String toString() { StringBuilder sb = new StringBuilder(); - sb.append(method.value).append(" ").append(path); + sb.append(method.value).append(' ').append(path); if (StrUtil.isNotBlank(queryString)) { - sb.append("?").append(queryString); + sb.append('?').append(queryString); } - sb.append(" "); - sb.append(protocol).append("/").append(version); + sb.append(' '); + sb.append(protocol).append('/').append(version); return sb.toString(); } @@ -346,9 +346,9 @@ public String toString() { @SuppressWarnings("deprecation") public String toUrlEncodedString(String charset) { StringBuilder sb = new StringBuilder(); - sb.append(method.value).append(" ").append(path); + sb.append(method.value).append(' ').append(path); if (StrUtil.isNotBlank(queryString)) { - sb.append("?");//.append(queryString); + sb.append('?');//.append(queryString); String[] keyValues = queryString.split("&"); int i = 0; for (String keyValue : keyValues) { @@ -358,21 +358,21 @@ public String toUrlEncodedString(String charset) { String value = keyValueArray[1]; if (StrUtil.isNotBlank(charset)) { try { - sb.append(name).append("=").append(URLEncoder.encode(value, charset)); + sb.append(name).append('=').append(URLEncoder.encode(value, charset)); } catch (UnsupportedEncodingException e) { - sb.append(name).append("=").append(URLEncoder.encode(value)); + sb.append(name).append('=').append(URLEncoder.encode(value)); } } else { - sb.append(name).append("=").append(URLEncoder.encode(value)); + sb.append(name).append('=').append(URLEncoder.encode(value)); } if (i != keyValues.length - 1) - sb.append("&"); + sb.append('&'); } i++; } } - sb.append(" "); - sb.append(protocol).append("/").append(version); + sb.append(' '); + sb.append(protocol).append('/').append(version); return sb.toString(); } diff --git a/src/zoo/http/parent/pom.xml b/src/zoo/http/parent/pom.xml index 8756ab37..d0037200 100644 --- a/src/zoo/http/parent/pom.xml +++ b/src/zoo/http/parent/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 @@ -11,7 +12,7 @@ org.t-io tio-zoo-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../../parent/pom.xml diff --git a/src/zoo/http/server/pom.xml b/src/zoo/http/server/pom.xml index 280ac004..8a1389ec 100644 --- a/src/zoo/http/server/pom.xml +++ b/src/zoo/http/server/pom.xml @@ -1,3 +1,4 @@ + @@ -8,7 +9,7 @@ org.t-io tio-http-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml diff --git a/src/zoo/parent/pom.xml b/src/zoo/parent/pom.xml index a4aa0fea..9e677637 100644 --- a/src/zoo/parent/pom.xml +++ b/src/zoo/parent/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 @@ -11,7 +12,7 @@ org.t-io tio-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../../parent/pom.xml diff --git a/src/zoo/webpack/core/pom.xml b/src/zoo/webpack/core/pom.xml index ca23a6e7..cbf76e99 100644 --- a/src/zoo/webpack/core/pom.xml +++ b/src/zoo/webpack/core/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 @@ -7,7 +8,7 @@ org.t-io tio-webpack-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml diff --git a/src/zoo/webpack/parent/pom.xml b/src/zoo/webpack/parent/pom.xml index 0b11117d..7a345038 100644 --- a/src/zoo/webpack/parent/pom.xml +++ b/src/zoo/webpack/parent/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 @@ -20,7 +21,7 @@ org.t-io tio-zoo-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../../parent/pom.xml diff --git a/src/zoo/websocket/client/pom.xml b/src/zoo/websocket/client/pom.xml index 766ffb5c..126d88e6 100644 --- a/src/zoo/websocket/client/pom.xml +++ b/src/zoo/websocket/client/pom.xml @@ -9,7 +9,7 @@ org.t-io tio-websocket-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml diff --git a/src/zoo/websocket/common/pom.xml b/src/zoo/websocket/common/pom.xml index 1fe27b60..9834f087 100644 --- a/src/zoo/websocket/common/pom.xml +++ b/src/zoo/websocket/common/pom.xml @@ -1,3 +1,4 @@ + @@ -8,7 +9,7 @@ org.t-io tio-websocket-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml @@ -17,10 +18,6 @@ org.t-io tio-http-common - - commons-codec - commons-codec - junit junit @@ -38,4 +35,4 @@ - \ No newline at end of file + diff --git a/src/zoo/websocket/parent/pom.xml b/src/zoo/websocket/parent/pom.xml index 969530af..6415a92d 100644 --- a/src/zoo/websocket/parent/pom.xml +++ b/src/zoo/websocket/parent/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 @@ -11,7 +12,7 @@ org.t-io tio-zoo-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../../parent/pom.xml diff --git a/src/zoo/websocket/server/pom.xml b/src/zoo/websocket/server/pom.xml index 68caa895..0ffba9d1 100644 --- a/src/zoo/websocket/server/pom.xml +++ b/src/zoo/websocket/server/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 @@ -7,7 +8,7 @@ org.t-io tio-websocket-parent - 3.7.0.v20201010-RELEASE + 3.7.5.v20211028-RELEASE ../parent/pom.xml diff --git a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java index 519cb76d..9e32de85 100644 --- a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java +++ b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/WsServerAioHandler.java @@ -195,10 +195,7 @@ recommend that a file or class name and description of purpose be included on import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -308,7 +305,7 @@ public WsRequest decode(ByteBuffer buffer, int limit, int position, int readable } byte[] allBody = new byte[allBodyLength]; - Integer index = 0; + int index = 0; for (WsRequest wsRequest : parts) { System.arraycopy(wsRequest.getBody(), 0, allBody, index, wsRequest.getBody().length); index += wsRequest.getBody().length; @@ -336,7 +333,14 @@ public WsRequest decode(ByteBuffer buffer, int limit, int position, int readable @Override public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext) { - WsResponse wsResponse = (WsResponse) packet; + // 处理 websocket 子协议 + WsResponse wsResponse; + if (packet instanceof WsResponse) { + wsResponse = (WsResponse) packet; + } else { + wsResponse = wsMsgHandler.encodeSubProtocol(packet, tioConfig, channelContext); + Objects.requireNonNull(wsResponse, "IWsMsgHandler encodeSubProtocol WsResponse is null."); + } // 握手包 if (wsResponse.isHandShake()) { @@ -350,8 +354,7 @@ public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext chan } } - ByteBuffer byteBuffer = WsServerEncoder.encode(wsResponse, tioConfig, channelContext); - return byteBuffer; + return WsServerEncoder.encode(wsResponse, tioConfig, channelContext); } /** @return the httpConfig */ @@ -379,6 +382,7 @@ private WsResponse h(WsRequest websocketPacket, byte[] bytes, Opcode opcode, Cha Object retObj = wsMsgHandler.onBytes(websocketPacket, bytes, channelContext); String methodName = "onBytes"; wsResponse = processRetObj(retObj, methodName, channelContext); + return wsResponse; } else if (opcode == Opcode.PING || opcode == Opcode.PONG) { log.debug("收到" + opcode); @@ -471,7 +475,7 @@ public void setHttpConfig(WsServerConfig httpConfig) { * @return * @author tanyaowu */ - public static HttpResponse updateWebSocketProtocol(HttpRequest request, ChannelContext channelContext) { + public HttpResponse updateWebSocketProtocol(HttpRequest request, ChannelContext channelContext) { Map headers = request.getHeaders(); String Sec_WebSocket_Key = headers.get(HttpConst.RequestHeaderKey.Sec_WebSocket_Key); @@ -499,9 +503,45 @@ public static HttpResponse updateWebSocketProtocol(HttpRequest request, ChannelC respHeaders.put(HeaderName.Connection, HeaderValue.Connection.Upgrade); respHeaders.put(HeaderName.Upgrade, HeaderValue.Upgrade.WebSocket); respHeaders.put(HeaderName.Sec_WebSocket_Accept, HeaderValue.from(acceptKey)); + + // websocket 子协议协商 + String[] supportedSubProtocols = wsMsgHandler.getSupportedSubProtocols(); + if (supportedSubProtocols != null && supportedSubProtocols.length > 0) { + String requestedSubProtocols = headers.get(HttpConst.RequestHeaderKey.Sec_Websocket_Protocol); + String selectSubProtocol = selectSubProtocol(requestedSubProtocols, supportedSubProtocols); + if (selectSubProtocol != null) { + respHeaders.put(HeaderName.Sec_Websocket_Protocol, HeaderValue.from(selectSubProtocol)); + } + } + httpResponse.addHeaders(respHeaders); return httpResponse; } return null; } + + /** + * Selects the first matching supported sub protocol + * + * @param requestedSubProtocols 请求中的子协议 + * @param subProtocols 系统支持得子协议,注意:不支持 * 通配 + * @return First matching supported sub protocol. Null if not found. + */ + private static String selectSubProtocol(String requestedSubProtocols, String[] subProtocols) { + if (requestedSubProtocols == null || subProtocols == null || subProtocols.length == 0) { + return null; + } + String[] requestedSubProtocolArray = requestedSubProtocols.split(","); + for (String p : requestedSubProtocolArray) { + String requestedSubProtocol = p.trim(); + for (String supportedSubProtocol : subProtocols) { + if (requestedSubProtocol.equals(supportedSubProtocol)) { + return requestedSubProtocol; + } + } + } + // No match found + return null; + } + } diff --git a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java index 9d5c3236..fb848249 100644 --- a/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java +++ b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsMsgHandler.java @@ -203,7 +203,7 @@ recommend that a file or class name and description of purpose be included on * @author tanyaowu * 2017年7月30日 上午9:34:59 */ -public interface IWsMsgHandler { +public interface IWsMsgHandler extends IWsSubProtocolsMsgHandler { /** *
  • 对httpResponse参数进行补充并返回,如果返回null表示不想和对方建立连接,框架会断开连接,如果返回非null,框架会把这个对象发送给对方
  • *
  • 注:请不要在这个方法中向对方发送任何消息,因为这个时候握手还没完成,发消息会导致协议交互失败。
  • @@ -215,7 +215,7 @@ public interface IWsMsgHandler { * @throws Exception * @author tanyaowu */ - public HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception; + HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception; /** * 握手成功后触发该方法 @@ -225,7 +225,7 @@ public interface IWsMsgHandler { * @throws Exception * @author tanyaowu */ - public void onAfterHandshaked(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception; + void onAfterHandshaked(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception; /** *
  • 当收到Opcode.BINARY消息时,执行该方法。也就是说如何你的ws是基于BINARY传输的,就会走到这个方法
  • diff --git a/src/zoo/websocket/common/src/main/java/org/tio/websocket/common/util/Md5.java b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsSubProtocolsMsgHandler.java similarity index 87% rename from src/zoo/websocket/common/src/main/java/org/tio/websocket/common/util/Md5.java rename to src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsSubProtocolsMsgHandler.java index a86c784d..7a9bb4ae 100644 --- a/src/zoo/websocket/common/src/main/java/org/tio/websocket/common/util/Md5.java +++ b/src/zoo/websocket/server/src/main/java/org/tio/websocket/server/handler/IWsSubProtocolsMsgHandler.java @@ -191,69 +191,41 @@ recommend that a file or class name and description of purpose be included on See the License for the specific language governing permissions and limitations under the License. */ -package org.tio.websocket.common.util; -import java.io.UnsupportedEncodingException; +package org.tio.websocket.server.handler; -import org.apache.commons.codec.digest.DigestUtils; +import org.tio.core.ChannelContext; +import org.tio.core.TioConfig; +import org.tio.core.intf.Packet; +import org.tio.websocket.common.WsResponse; /** + * websocket 子协议处理器 * - * @author tanyaowu - * 2017年7月30日 上午10:11:28 + * @author L.cm + * 2021年7月31日 上午10:34:59 */ -public class Md5 { +public interface IWsSubProtocolsMsgHandler { - /** - * - * @param content - * @param charset - * @return - * @author tanyaowu - */ - private static byte[] getContentBytes(String content, String charset) { - if (charset == null || "".equals(charset)) { - return content.getBytes(); - } - try { - return content.getBytes(charset); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset); - } - } + /** + * 获取支持的子协议 + * + * @return 子协议数组 + */ + default String[] getSupportedSubProtocols() { + return null; + } - public static String getMD5(String input) { - return sign(input, "", "utf-8"); - } - - /** - * 签名字符串 - * @param text 需要签名的字符串 - * @param key 密钥 - * @param input_charset 编码格式 - * @return 签名结果 - */ - public static String sign(String text, String key, String input_charset) { - text = text + key; - return DigestUtils.md5Hex(getContentBytes(text, input_charset)); - } - - /** - * 签名字符串 - * @param text 需要签名的字符串 - * @param sign 签名结果 - * @param key 密钥 - * @param input_charset 编码格式 - * @return 签名结果 - */ - public static boolean verify(String text, String sign, String key, String input_charset) { - text = text + key; - String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset)); - if (mysign.equals(sign)) { - return true; - } else { - return false; - } - } + /** + * 解析子编码 + * + * @param packet Packet + * @param tioConfig TioConfig + * @param channelContext ChannelContext + * @return Packet + */ + default WsResponse encodeSubProtocol(Packet packet, TioConfig tioConfig, ChannelContext channelContext) { + return null; + } }