java-websocket错误:Control frame cant have fin==false set

最近在做一个websocket的项目,
所运用的包为如下所示

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.5.1</version>
</dependency>

在连接服务器大约一分钟后会出现如下错误,错误码1002,表示为协议错误

org.java_websocket.exceptions.InvalidFrameException: Control frame cant have fin==false set
	at org.java_websocket.framing.ControlFrame.isValid(ControlFrame.java:48)
	at org.java_websocket.drafts.Draft_6455.translateSingleFrame(Draft_6455.java:517)
	at org.java_websocket.drafts.Draft_6455.translateFrame(Draft_6455.java:675)
	at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:376)
	at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:216)
	at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:506)
	at java.lang.Thread.run(Thread.java:748)

在网上查了很久也没查到,于是点进源码进去查看。发现问题主要出现在Draft_6455处的translateSingFrame方法处的frame.isValid(),也就是说判断这帧是否是有效的。

frame.isValid()方法中有四个判断,如果有任意不符即会抛出异常,停止程序,我们所抛出的错误就是第一个,判断fin(fin的set也在translateSingFrame中,boolean fin = b1 >> 8 != 0; boolean rsv1 = ( b1 & 0x40 ) != 0;)是否为true,如果为true则正常进行,如果为false则抛出异常。
归根结底,是我所收到的信息,是在通过Draft_6455解析不正常导致。

解决方法(不知道是否有安全隐患和程序崩溃隐患):

  • 找到了问题的所在,我们只要新建一个在建立websocket连接时的Draft,不使用Java-WebSocket包的本身提供的Draft_6455即可。
  • 将Draft_6455复制到自己的项目下面,删除其中的frame.isValid();(在517行),其中idea还会有错的提示,在223行处,显示readVersion是在其他包中但没有用public定义,我们这一行及后面相关的也删除(225-229行)
int v = readVersion( handshakedata );
if( v != 13 ) {
   log.trace("acceptHandshakeAsServer - Wrong websocket version.");
   return HandshakeState.NOT_MATCHED;
}

在新建websocket的连接时使用自己创建的Draft对象即可正常运行。

你可能感兴趣的:(java)