1
janxin 2017-06-26 09:42:19 +08:00 via iPhone
websocket 不是 http,你说的这些本来就不一定能用
|
2
nutting 2017-06-26 09:45:56 +08:00 via Android
用 spring 引入 mina 这种 socket 框架?
|
3
hncqp 2017-06-26 09:46:59 +08:00
如果用 cpp 就简单了,不过 java 应该也是可以直接用 socket 的吧?
|
4
HunterPan 2017-06-26 09:50:20 +08:00
可以用 spring-websocket
|
5
des 2017-06-26 10:04:09 +08:00 via Android
如果实在没辙何不单独再写一套专门用来推送的?
|
6
RainFinder 2017-06-26 10:10:36 +08:00
@des 什么叫专门用来推送的?
|
7
dthor 2017-06-26 10:17:06 +08:00
如果只是服务端推送的话,可以考虑 server sent event
|
8
ixiaohei 2017-06-26 10:32:59 +08:00
以前我搞过,当时选 spring 的 websocket 集成,但是不了解框架内部原理集成失败了,后面 netty 搞的 socket 长连接做的推送,用 listener 启动 netty 服务就行,另外主要 keepalive 和 tcp 粘包处理。
|
9
ixiaohei 2017-06-26 10:37:17 +08:00
注意做好 keepalive 和 tcp 粘包处理,注意区分 keepalive 时候服务器推和客户端推各自的好处,主要是清除 tcp 非意外断开的链接,忘记这个学术名词叫啥了。
|
10
abcbuzhiming OP @des 核心问题时想复用现在的这一套用户验证机制,结果发现目前基于 session ( cookie )的验证机制没法用在新的推送上
|
11
abcbuzhiming OP @RainFinder 以前的交换模型是纯粹的“请求——响应”,而且用用户验证机制,基于 session ( shiro )的,要推送的话,也是必须先沿着用户身份的,所以开始才考虑 websocket,希望能无痛升级,结果发现无法复用,java 实现的 websocket 有一个要求,用于处理 websocket 请求的那个 servlet 必须是独立的,并不能复用处理普通 http 请求的那个,于是就无法复用现有的用户验证体系。就僵在这里了
|
12
RainFinder 2017-06-26 10:55:38 +08:00
@dthor 看了介绍,其实也就是一种长连接吧,做了事件监听
|
13
RainFinder 2017-06-26 10:57:51 +08:00
记得当初看 websocket 是在 header 中加入了特殊字段标识 websocket 吧,其他验证信息也是可以获取的啊,你的认证信息是怎么实现的,cookie 吗
|
14
fzleee 2017-06-26 11:14:02 +08:00
可以这么做:
1. 假定 http 的服务和 websocket 的服务各有一个,运行在独立的进程甚至独立的服务器上。 2.浏览器首次建立 websocket 连接时,websocket 服务器从浏览器请求的 cookie 里面获取认证 token。 3. websocket 服务器同步或者异步将 cookie 发送给 http 服务进行认证。认证失败则断开连接。 |
15
vjnjc 2017-06-26 11:41:13 +08:00
感兴趣,貌似 socket 和 http server 没法在同一个 domain(schema://host:port)下面混用吧。
坐等高手 |
16
wucao219101 2017-06-26 11:48:00 +08:00
可以用 spring-websocket,另外 Session 是可以复用的。
具体配置: ``` <websocket:handlers> <websocket:mapping path="/websocket/chat" handler="chatWebsocketHandle" /> <websocket:handshake-interceptors> <bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor" /> </websocket:handshake-interceptors> </websocket:handlers> <bean id="yourWebsocketHandle" class="com.xxg.YourWebsocketHandle" /> ``` 在 YourWebsocketHandle 中再通过 ``` String value = (String) webSocketSession.getAttributes().get("your-session-key"); ``` 可以获取 session 的值。 |
17
sagaxu 2017-06-26 12:17:29 +08:00
真有意思,我记得之前用 websocket,配置文件改改就好了啊
|
18
NUT 2017-06-26 12:21:29 +08:00 via iPhone
最好的是自己用 Netty 开发一个服务端,鉴权通过目前系统实现。开发工作量不小。
|
19
zander1024 2017-06-26 12:21:50 +08:00
。。。 没做过 java 的 .net 的做过一个简易的 。
java 实现的 websocket 有一个要求,用于处理 websocket 请求的那个 servlet 必须是独立的,并不能复用处理普通 http 请求的那个,于是就无法复用现有的用户验证体系。就僵在这里了 .net 里需要继承 webapi 但是貌似没有规定必须是一个独立的服务 |
21
3dwelcome 2017-06-26 13:17:31 +08:00
我做过,但不是用 java。判断如果 socket 开始四个字节是"GET "或"POST",就走 http 服务器。如果不是,那么就走正常的 socket 二进制协议。
|
22
liuxu 2017-06-26 13:31:16 +08:00
你可以用 http server + workerman
如果要处理 session 同步问题,可以做一个内网用的接口给 workerman 查询 详细的你可以加他们官方群,群主以前也是 V2EX 玩的,技术厉害而且对新人的问题会很耐心的解答 |
23
QQ2171775959 2017-06-26 13:54:33 +08:00
用独立的服务器来做,性能比较能够满足的。
|
24
qieqie 2017-06-26 15:13:54 +08:00
websocket 就是为了直接复用 web infrastructure 搞出来的,
没道理不能复用,要不然和直接用 TCP 有什么区别 |
25
yuchting 2017-06-26 17:40:54 +08:00
我知道你们都是标准前后端的。
我歪个楼,我用的 Java + Netty 直接写底层 socket+http 协议,直接就混了。。。 |
26
z5864703 2017-06-26 17:44:21 +08:00
直接监听一个端口实现 websocket 和 http 服务,根据请求内容格式分发到对应业务逻辑,是可以实现的
|
27
notreami 2017-06-26 19:31:19 +08:00
为什么要用 session,而不是自行弄一个 token ?
|
28
abcbuzhiming OP @notreami 因为已有的代码都是基于 session 的,搞个新的,你得把之前的代码全改了
|
30
hsmocc 2017-06-27 00:38:53 +08:00 via iPhone
没搞过 websocket,我也想知道权限如何控制的。搜了一下,ws 的 session 是可以关联页面中 httpsession 的,它们关联的时机是在 ws 握手的时候,因为 ws 的握手是通过 http 完成的。所以我感觉权限控制可以在 ws 握手时候,如果没有权限握手就失败。
|
32
raofeng 2017-06-27 11:29:42 +08:00
|
33
colincat 2017-06-27 17:35:43 +08:00 via iPhone
可以复用,以前搞过,不过当时是基于 tomcat7 做的,session 也可以复用的
|
34
abcbuzhiming OP @colincat 我遇到个新问题,你们当时在 tomcat 下做 websocket,是如何解决服务端超时检测这个问题的,即一段时间没有收到来自客户端的数据就断开。这个在别的 socket 实现下很简单的功能在 tomcat 下好难啊,放狗了两天,没找到肯定的答案
|
35
colincat 2017-06-28 11:09:18 +08:00 via iPhone
@abcbuzhiming 我们是自己做心跳啊,就可以判断超时
|