From 71654ad287c34b6d70e5999353e7c9b68dd0f33e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=B0=E5=B9=B3=E7=BA=BF?= <22250530@qq.com> Date: Thu, 2 Jul 2015 08:24:41 +0800 Subject: [PATCH] --- .../wentch/redkale/net/http/WebSocket.java | 10 ++++++++ .../redkale/net/http/WebSocketBinary.java | 23 +++++++++++++++++++ .../redkale/net/http/WebSocketRunner.java | 9 +++++++- .../redkale/net/http/WebSocketServlet.java | 5 +++- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/com/wentch/redkale/net/http/WebSocketBinary.java diff --git a/src/com/wentch/redkale/net/http/WebSocket.java b/src/com/wentch/redkale/net/http/WebSocket.java index 8cbbc8631..9f64eb45c 100644 --- a/src/com/wentch/redkale/net/http/WebSocket.java +++ b/src/com/wentch/redkale/net/http/WebSocket.java @@ -5,6 +5,7 @@ */ package com.wentch.redkale.net.http; +import com.wentch.redkale.net.*; import com.wentch.redkale.service.*; import java.io.*; import java.util.*; @@ -164,8 +165,17 @@ public abstract class WebSocket { } /** + * WebSocketBinary模式流程顺序: onOpen、createGroupid、onRead * WebSocket流程顺序: onOpen、createGroupid、onConnected、onMessage/onFragment+、onClose */ + + /** + * + * @param channel + */ + public void onRead(AsyncConnection channel) { + } + public void onConnected() { } diff --git a/src/com/wentch/redkale/net/http/WebSocketBinary.java b/src/com/wentch/redkale/net/http/WebSocketBinary.java new file mode 100644 index 000000000..042d78995 --- /dev/null +++ b/src/com/wentch/redkale/net/http/WebSocketBinary.java @@ -0,0 +1,23 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.wentch.redkale.net.http; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 被标记为 @WebSocketBinary 的WebSocketServlet 将使用原始的TCP传输, 通常用于类似音频/视频传输场景 + * + * @author zhangjx + */ +@Inherited +@Documented +@Target({TYPE}) +@Retention(RUNTIME) +public @interface WebSocketBinary { + +} diff --git a/src/com/wentch/redkale/net/http/WebSocketRunner.java b/src/com/wentch/redkale/net/http/WebSocketRunner.java index e4eaac1c0..33f3c95c1 100644 --- a/src/com/wentch/redkale/net/http/WebSocketRunner.java +++ b/src/com/wentch/redkale/net/http/WebSocketRunner.java @@ -42,11 +42,14 @@ public class WebSocketRunner implements Runnable { private final BlockingQueue queue = new ArrayBlockingQueue(1024); - public WebSocketRunner(Context context, WebSocket webSocket, AsyncConnection channel) { + private final boolean wsbinary; + + public WebSocketRunner(Context context, WebSocket webSocket, AsyncConnection channel, final boolean wsbinary) { this.context = context; this.engine = webSocket.engine; this.webSocket = webSocket; this.channel = channel; + this.wsbinary = wsbinary; webSocket.runner = this; this.coder.logger = context.getLogger(); this.coder.debugable = context.getLogger().isLoggable(Level.FINEST); @@ -62,6 +65,10 @@ public class WebSocketRunner implements Runnable { webSocket.onConnected(); channel.setReadTimeoutSecond(300); //读取超时5分钟 if (channel.isOpen()) { + if (wsbinary) { + webSocket.onRead(channel); + return; + } channel.read(readBuffer, null, new CompletionHandler() { private ByteBuffer recentExBuffer; diff --git a/src/com/wentch/redkale/net/http/WebSocketServlet.java b/src/com/wentch/redkale/net/http/WebSocketServlet.java index 740e766f9..0d3bad220 100644 --- a/src/com/wentch/redkale/net/http/WebSocketServlet.java +++ b/src/com/wentch/redkale/net/http/WebSocketServlet.java @@ -34,6 +34,9 @@ public abstract class WebSocketServlet extends HttpServlet { } } + //是否用于二进制流传输 + protected final boolean wsbinary = getClass().getAnnotation(WebSocketBinary.class) != null; + @Resource protected WebSocketNodeService nodeService; @@ -102,7 +105,7 @@ public abstract class WebSocketServlet extends HttpServlet { } webSocket.groupid = groupid; engine.add(webSocket); - context.submit(new WebSocketRunner(context, webSocket, response.removeChannel())); + context.submit(new WebSocketRunner(context, webSocket, response.removeChannel(), wsbinary)); response.finish(true); }