2012-01-26 21 views
0

我有Netty 3.3服务器与WebSockets从https://github.com/netty/netty/tree/3.2/src/main/java/org/jboss/netty/example/http/websocketx/server如何在Netty 3.3中配置WebSockets(RFC 6455)?

我有客户端实现RFC 6455,但服务器无法解码它的默认消息。在调试时,我看到使用了WebSocket08FrameDecoder(而不是WebSocket13FrameDecoder)。当我将客户端降级到draft00时,一切正常。 如何配置Netty来解码RFC 6455消息?

更新

客户端发送此握手包:

GET /websocket HTTP/1.1 
Upgrade: WebSocket 
Connection: Upgrade 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Key: 5a087 
Host: 127.0.0.1 
Origin: 127.0.0.1 

和服务器上的handshaker是WebSocketServerHandshaker13,但我仍然得到错误:

org.jboss.netty.handler.codec.frame.CorruptedFrameException: unmasked client to server frame 
at org.jboss.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder.protocolViolation(WebSocket08FrameDecoder.java:350) 
at org.jboss.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder.decode(WebSocket08FrameDecoder.java:138) 
at org.jboss.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder.decode(WebSocket08FrameDecoder.java:56) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:465) 
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:438) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:343) 
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:274) 
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:194) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662)` 

回答

2

如果你在看WebSocketServerHandshakerFactory,它实现了基于HTTP头中传递的Web套接字版本的解码器。

public WebSocketServerHandshaker newHandshaker(HttpRequest req) { 

    String version = req.getHeader(Names.SEC_WEBSOCKET_VERSION); 
    if (version != null) { 
     if (version.equals(WebSocketVersion.V13.toHttpHeaderValue())) { 
      // Version 13 of the wire protocol - RFC 6455 (version 17 of the draft hybi specification). 
      return new WebSocketServerHandshaker13(webSocketURL, subprotocols, allowExtensions); 
     } else if (version.equals(WebSocketVersion.V08.toHttpHeaderValue())) { 
      // Version 8 of the wire protocol - version 10 of the draft hybi specification. 
      return new WebSocketServerHandshaker08(webSocketURL, subprotocols, allowExtensions); 
     } else { 
      return null; 
     } 
    } else { 
     // Assume version 00 where version header was not specified 
     return new WebSocketServerHandshaker00(webSocketURL, subprotocols); 
    } 
} 

请检查您的客户端实施,以查看它在HTTP标头中发送的版本。它应该是Sec-WebSocket-Version: 13

+0

我添加客户端握手包和调试日志来回答 – Quiz

+0

它应该是在客户端掩码问题。感谢您的答复。 – Quiz