resin Websocket 连接或者返回数据时报错: Received unexpected continuation frame.websocket;resin java.lang.Illega

以下是我的经验,如果同学们有发现不对的地方和有蹊跷的地方,欢迎指点和提问!

问题

最近在用resin写websocket服务端,前端用原生js ws实现通信时,在连接时报错:

Received unexpected continuation frame.websocket;

同时,在后端返回数据的时候还报错:

resin java.lang.IllegalStateException: IDLE

或:

resin java.lang.IllegalStateException: FIRST

解决

在网上查阅资料没有明确说明的,于是就自己检查后端代码,发现了一个问题,描述问题之前,先说下我的使用情景:

首先,js与后端简历ws连接,成功后js发送一条数据给后端,后端收到后会执行相应的任务,不过是以创建一个线程的方式异步执行,同时会返回js一个类似于“正在执行中,请等待”的字样。

看到这里后,发现了问题,那就是我的代码执行顺序是:(以下用文字伪代码描述)

收到js的数据

创建线程

线程start

返回“执行中请等待。。。”字样

问题就在于,如果那个线程执行的很快,就会出现和返回等待字样的线程一起执行发送数据给前端的操作。

而发送数据用的是resin的WebSocketContext对象(细致的说是:WebSocketContext.startTextMessage()获取的PrintWriter来书写的).所以就会出现一下子把两个数据合并发送的情况,或许跟这个有关系(回想起发现这个问题也确实是线程任务执行很快的时候出现的)。

于是我改成先发送回等待字样,然后在线程start。

就再没出现过问题了。

总结

websocet编程使用异步的时候,要注意writer的多线程下的使用,同时注意下 发送顺序以及前端js对混合数据的处理。

以上是我的经验,如果同学们有发现不对的地方和有蹊跷的地方,欢迎指点和提问!

你可能感兴趣的:(JAVA,resin,websocket)