WebSocket实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebSocket实践相关的知识,希望对你有一定的参考价值。

基本弄清楚了WebSocket的来龙去脉后,开始了实现WebSocket技术的探索。

看过一篇文章,测试了八种WebSocket框架性能,得以了解到实现WebSocket技术的框架有:
Netty、Undertow、Jetty、Vert.x、Grizzly、spray-websocket、node.js-websocket/Node.js、Golang
补充下:
作为老牌的servle容器,tomcat实际也可以实现WebSocket技术。

下面说一下我遇到的一个标准:JSR356标准:
JSR 356,对于WebSocket的的Java API
这标志着所有兼容JAVA EE 7的应用程序都必须实现这个API。
java开发人员不需要关注websocket具体的实现,而只要关注逻辑就可以了。
具体带来的好处是,比如java EE容器,必须实现这个标准,使我们的编码可以统一规范(之前是如果你使用jetty,那么使用jetty的jar包实现websocket是一套API,如果你使用tomcat,那么使用tomcatjar包实现websocket是一套API,而现在统一的使用一套就可以了)。
但是jetty是在9.1版本之后才实现的(起初我的demo项目怎么也访问不到服务端的websocket,是jetty版本过低。),tomcat是在7之后实现的。

下面是具体实现的代码
1.首先需要引用jar包
scope为provided,为了防止容器本身的websocket音响。

  1. <dependency>
  2. <groupId>javax</groupId>
  3. <artifactId>javaee-api</artifactId>
  4. <version>7.0</version>
  5. <scope>provided</scope>
  6. </dependency>

2.服务端的代码:

  1. package com.lanyoung.im.back.ly.websocket;
  2. import javax.websocket.OnClose;
  3. import javax.websocket.OnMessage;
  4. import javax.websocket.OnOpen;
  5. import javax.websocket.Session;
  6. import javax.websocket.server.ServerEndpoint;
  7. import java.io.IOException;
  8. @ServerEndpoint("/websocket")
  9. public class WebSocketTest {
  10. @OnMessage
  11. public void onMessage(String message, Session session)
  12. throws IOException, InterruptedException {
  13. // Print the client message for testing purposes
  14. System.out.println("Received: " + message);
  15. // Send the first message to the client
  16. session.getBasicRemote().sendText("This is the first server message");
  17. // Send 3 messages to the client every 5 seconds
  18. int sentMessages = 0;
  19. while(sentMessages < 3){
  20. Thread.sleep(5000);
  21. session.getBasicRemote().
  22. sendText("This is an intermediate server message. Count: "
  23. + sentMessages);
  24. sentMessages++;
  25. }
  26. // Send a final message to the client
  27. session.getBasicRemote().sendText("This is the last server message");
  28. }
  29. @OnOpen
  30. public void onOpen () {
  31. System.out.println("Client connected");
  32. }
  33. @OnClose
  34. public void onClose () {
  35. System.out.println("Connection closed");
  36. }
  37. }

3.客户端代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Testing websockets</title>
  5. </head>
  6. <body>
  7. <div>
  8. <input type="submit" value="Start" onclick="start()" />
  9. </div>
  10. <div id="messages"></div>
  11. <script type="text/javascript">
  12. var webSocket =
  13. new WebSocket(‘ws://localhost:8080/websocket‘);
  14. webSocket.onerror = function(event) {
  15. onError(event)
  16. };
  17. webSocket.onopen = function(event) {
  18. onOpen(event)
  19. };
  20. webSocket.onmessage = function(event) {
  21. onMessage(event)
  22. };
  23. function onMessage(event) {
  24. document.getElementById(‘messages‘).innerHTML
  25. += ‘<br />‘ + event.data;
  26. }
  27. function onOpen(event) {
  28. document.getElementById(‘messages‘).innerHTML
  29. = ‘Connection established‘;
  30. }
  31. function onError(event) {
  32. alert(event.data);
  33. }
  34. function start() {
  35. webSocket.send(‘hello‘);
  36. return false;
  37. }
  38. </script>
  39. </body>
  40. </html>


















以上是关于WebSocket实践的主要内容,如果未能解决你的问题,请参考以下文章

动手实践,即时通讯WebSocket的代码实现

Watson语音到文本 - 无法构造'WebSocket':URL包含片段标识符

WebSocket实践

群组聊天的 Websocket 最佳实践/所有群组一个 websocket 还是每组一个 websocket?

WebSocket 服务器的最佳实践是啥?

逆向及Bof基础实践