2012-08-15 31 views
0

我正在嘗試使用Netty實現websocket。我試圖DiscardServer例如,如果我把它用telnet像在瀏覽器中使用Netty綁定帶websocket的短信

Telnet localhost 8090. 

所以,無論我把在終端窗口返回我回消息,只要運行它工作正常。但是現在我想在瀏覽器中實現同樣的功能,就像我在文本區域中放置一些文本消息一樣,那麼它應該在瀏覽器上顯示該文本消息。

我可以用下面的代碼

ChannelFactory factory = new NioServerSocketChannelFactory(
      Executors.newCachedThreadPool(), 
      Executors.newCachedThreadPool()); 

    ServerBootstrap bootstrap = new ServerBootstrap(factory); 

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() { 
     public ChannelPipeline getPipeline() { 
      return Channels.pipeline(new DiscardServerHandler()); 
     } 
    }); 

    bootstrap.setOption("child.tcpNoDelay", true); 
    bootstrap.setOption("child.keepAlive", true); 

    bootstrap.bind(new InetSocketAddress(8090)); 

啓動WebSocket的服務器,但我怎麼能在我的文本區結合我的短信與WebSocket伺服器

----更新--- -

我已經創建MyServerHandler類

public class MyServerHandler extends SimpleChannelUpstreamHandler { 

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
    Object msg = e.getMessage();   
    //msg.getClass(); 
    if (msg instanceof HttpRequest) { 
        //handleHttpRequest(ctx, (HttpRequest) msg); 
     ctx.getChannel().write(msg); 
    } else if (msg instanceof WebSocketFrame) { 
     //handleWebSocketFrame(ctx, (WebSocketFrame) msg); 
    } 

} 
    } 

它的調用messageReceived方法,但不會去任何條件。

我寫WebSocketServerPipelineFactory類也

public class WebSocketServerPipelineFactory implements ChannelPipelineFactory { 

@Override 
    public ChannelPipeline getPipeline() throws Exception { 
     // Create a default pipeline implementation. 
     ChannelPipeline pipeline = pipeline(); 
     pipeline.addLast("decoder", new HttpRequestDecoder()); 
     pipeline.addLast("aggregator", new HttpChunkAggregator(65536)); 
     pipeline.addLast("encoder", new HttpResponseEncoder()); 
     pipeline.addLast("handler", new MyServerHandler()); 
     return pipeline; 
    } 
    } 

我的事了這一類也不得調用方法。

在JSP文件中我寫

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script> 
    <script> 
    var MESSAGE_HANDSHAKE = "handshake"; 
    var MESSAGE_OPPONENT_UPDATE = "response"; 
    var MESSAGE_TURN_INDICATOR = "turn"; 
    var MESSAGE_GAME_OVER = "game_over"; 
    var WEBSOCKET_URL = "ws://localhost:8090"; 
    $(document).ready(function() { 
    ws = new WebSocket(WEBSOCKET_URL); 

    ws.onopen = function(event) { 
alert("test"); 
$('#status').text("Waiting...."); 
    }; 

    ws.onmessage = function(event) { 
    var message = jQuery.parseJSON(event.data); 

    alert(message.type); 
    } 

    }); 

<body> 
<p id="status">&nbsp;</p> 
</body> 

它不會去任何的jQuery方法。我還錯過了什麼嗎?

而且,如果我寫

ws.send("Test Message"); 

它拋出以下Java腳本錯誤

Uncaught Error: INVALID_STATE_ERR: DOM Exception 11 login.htm:33 
(anonymous function) login.htm:33 
f.extend._Deferred.e.resolveWith jquery.min.js:2 
e.extend.ready jquery.min.js:2 
c.addEventListener.C 

如果我使用

var WEBSOCKET_URL = "wss://echo.websocket.org/"; 

然後它原來是這樣,我不能夠連接到我的服務器?

我使用eclipse來運行此代碼。我使用Apache Tomcat運行我的jsp代碼,並通過運行WebsocketServer.class作爲java應用程序來運行websocket服務器。這有什麼區別?

---更新---

我寫了下面的MyServerHandler類的方法和得到的錯誤在我的瀏覽

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing 

MySeverHandler.java

private void handleHttpRequest(ChannelHandlerContext ctx, HttpRequest req) 
     throws Exception { 

    // Allow only GET methods. 
    if (req.getMethod() != HttpMethod.GET) { 
    // sendHttpResponse(ctx, req, new DefaultHttpResponse(
     //  HttpVersion.HTTP_1_1, HttpResponseStatus.FORBIDDEN)); 
     return; 
    } 

    // Serve the WebSocket handshake request. 
    if (req.getUri().equals(WEBSOCKET_PATH) 
      && Values.UPGRADE.equalsIgnoreCase(req.getHeader(CONNECTION)) 
      && WEBSOCKET.equalsIgnoreCase(req.getHeader(Names.UPGRADE))) { 

     // Create the WebSocket handshake response. 
     HttpResponse res = new DefaultHttpResponse(
       HTTP_1_1, 
       new HttpResponseStatus(101, "Web Socket Protocol Handshake")); 
     res.addHeader(Names.UPGRADE, WEBSOCKET); 
     res.addHeader(CONNECTION, Values.UPGRADE); 


     // Upgrade the connection and send the handshake response. 
     ChannelPipeline p = ctx.getChannel().getPipeline(); 
     p.remove("aggregator"); 
     p.replace("decoder", "wsdecoder", new WebSocketFrameDecoder()); 

     // Write handshake response to the channel 
     ctx.getChannel().write(res); 

     // Upgrade encoder to WebSocketFrameEncoder 
     p.replace("encoder", "wsencoder", new WebSocketFrameEncoder()); 

     // Initialize the game. Assign players to a game and assign them a letter (X or O) 
     ///initGame(ctx); 

     return; 
    } 

    // Send an error page otherwise. 
    sendHttpResponse(ctx, req, new DefaultHttpResponse(
      HttpVersion.HTTP_1_1, HttpResponseStatus.FORBIDDEN)); 
} 
+0

「它的調用messageReceived方法,但不會去任何條件。」什麼是傳入對象的類呢?做一個調試或打印聲明並檢查出來。最好的辦法就是看看github,web上的最新例子。井字遊戲有點過時了。 – Abe 2012-08-16 15:51:28

+0

的類名是類org.jboss.netty.buffer.BigEndianHeapChannelBuffer是否正確? – user965884 2012-08-16 15:55:32

+0

如何在netty websocket上的github中找到最近的示例? – user965884 2012-08-16 16:00:16

回答

1

的Netty使用責任鏈設計模式,所以無論何時需要使用協議,您都需要創建合適的解碼器/編碼器在你的管道中。對於websocket,這是一個示例管道。

public class WebSocketServerPipelineFactory implements ChannelPipelineFactory { 
    public ChannelPipeline getPipeline() throws Exception { 
      // Create a default pipeline implementation. 
      ChannelPipeline pipeline = pipeline(); 
      pipeline.addLast("decoder", new HttpRequestDecoder()); 
      pipeline.addLast("aggregator", new HttpChunkAggregator(65536)); 
      pipeline.addLast("encoder", new HttpResponseEncoder()); 
      pipeline.addLast("handler", new YourBusinessHandler()); 
      return pipeline; 
    } 

}

你可以寫在你的樓內設有商務處理任何業務邏輯。在這種情況下,你只會迴應你收到的東西,所以它會像這個處理程序中的channel.write(incomingMessage);一樣。

查看此tic-tac-toe game欲知更多信息。 github上還有很多關於如何做到這一點的鏈接信息。

+0

嗨安倍,謝謝你的迴應文章看起來不錯,但我仍然面臨一些問題,你可以請檢查我的更新。 – user965884 2012-08-16 11:16:50

相關問題