WebSocket spring示例demo (已使用sockJs库)

1、简介

作为下一代的Web标准,HTML5拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket等等。这其中有“Web TCP”之称的 WebSocket格外吸引开发人员的注意。WebSocket的出现使得浏览器提供对 Socket的支持成为可能,从而在浏览器和服务器之间提供了一个基于TCP连接的双向通道。Web开发人员可以非常方便地使用WebSocket构建实时 web 应用,开发人员的手中从此又多了一柄神兵利器。

            Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事,但是对于那些实时要求比较高的应用来说,比如说在线游戏、在线证券、设备监控、新闻在线播报、RSS订阅推送等等,当客户端浏览器准备呈现这些信息的时候,这些信息在服务器端可能已经过时了。所以保持客户端和服务器端的信息同步是实时 Web应用的关键要素,对 Web开发人员来说也是一个难题。在 WebSocket规范出来之前,开发人员想实现这些实时的Web应用,不得不采用一些折衷的方案,其中最常用的就是轮询(Polling) Comet 技术,而Comet技术实际上是轮询技术的改进,又可细分为两种实现方式,一种是长轮询机制,一种称为流技术。

            HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet技术,使客户端浏览器具备像 C/S架构下桌面系统的实时通讯能力。浏览器通过JavaScript向服务器发出建立 WebSocket连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP连接直接交换数据。因为 WebSocket连接本质上就是一个TCP连接,所以在数据传输的稳定性和数据传输量的大小方面,和轮询以及Comet技术比较,具有很大的性能优势。

但是鉴于web socket 对浏览器要求比较高,为了解决这个问题,推出了sockJS,SockJS是一个JavaScript库,提供跨浏览器javascriptAPI,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。

2、相关环境要求

Spring4.0.6(要选择4.0+),tomcat7.0.55版本,JDK1.7。

3、具体代码

(以下代码亲测可用!)

(1)web.xml:

<?xmlversion="1.0"encoding="UTF-8"?>
<web-app version="3.1" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <description>用来测试WebSocket基础上推送的功能</description>
    <distributable/>
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>     
    </filter>
    <filter-mapping>
      <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- Spring 刷新Introspector防止内存泄露 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>      
        <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
           30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>testSocket.jsp</welcome-file>
    </welcome-file-list>
</web-app>

(2) dispatcher-servlet.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<beans:beansxmlns="http://www.springframework.org/schema/mvc"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <annotation-driven/>
    <!-- 自动扫描的包名 -->
    <context:component-scanbase-package="zyy.sockjs.config"></context:component-scan>
</beans:beans>

(3) HandshakeInterceptor.java

package zyy.sockjs.config;
import java.util.Map;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

@Component
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request,
    ServerHttpResponse response, WebSocketHandler wsHandler,
    Map<String, Object> attributes) throws Exception {
    System.out.println("Before Handshake");
    return super.beforeHandshake(request,response,wsHandler,attributes);
}

@Override
public void afterHandshake(ServerHttpRequest request,
    ServerHttpResponse response, WebSocketHandler wsHandler,
    Exception ex) {
    System.out.println("After Handshake");
    super.afterHandshake(request,response,wsHandler,ex);
}
}


(4)InfoSocketEndPoint.java

package zyy.sockjs.config;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

@Component
public class InfoSocketEndPoint extends TextWebSocketHandler {
public InfoSocketEndPoint() {
}

@Override
protected void handleTextMessage(WebSocketSession session,
	TextMessage message) throws Exception {
	super.handleTextMessage(session, message);
	TextMessage returnMessage = new TextMessage(message.getPayload()
	+ " received at server");
	session.sendMessage(returnMessage);
}
}

(5)SystemWebSocketHandler.java

package zyy.sockjs.config;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
/**
*
* @author dayu
*/

@Component
public class SystemWebSocketHandler implements WebSocketHandler {
   @Override
   public void afterConnectionEstablished(WebSocketSession session) throws Exception {
       System.out.println("connect to the websocket success......");
       session.sendMessage(new TextMessage("Server:connected OK!"));
   }

   @Override
   public void handleMessage(WebSocketSession wss, WebSocketMessage<?> wsm) throws Exception {
      TextMessage returnMessage = new TextMessage(wsm.getPayload()
	  + " received at server");
	  wss.sendMessage(returnMessage);
   }

   @Override
   public void handleTransportError(WebSocketSession wss, Throwable thrwbl) throws Exception {
       if(wss.isOpen()){
           wss.close();
       }
      System.out.println("websocket connection closed......");
   }

   @Override
   public void afterConnectionClosed(WebSocketSession wss, CloseStatus cs) throws Exception {
       System.out.println("websocket connection closed......");
   }

   @Override
   public boolean supportsPartialMessages() {
       return false;
   }
}

(6)WebSocketConfig.java

package zyy.sockjs.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements
        WebSocketConfigurer {
    public WebSocketConfig() {
    }

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(systemWebSocketHandler(), "/websck").addInterceptors(new HandshakeInterceptor());
       System.out.println("registed!");
        registry.addHandler(systemWebSocketHandler(), "/sockjs/websck/info").addInterceptors(new HandshakeInterceptor())
                .withSockJS();
    }

    @Bean
    public WebSocketHandler systemWebSocketHandler() {
        return new SystemWebSocketHandler();
    }
}

(7)testSocket.jsp


<%@ page language="java"contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE htmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=ISO-8859-1">
<title>WebSocket/SockJS Echo Sample (Adapted from Tomcat's echo sample)</title>
    <style type="text/css">
        #connect-container {
            float: left;
            width: 400px
        }
        #connect-container div {
           padding: 5px;
        }
        #console-container {
            float: left;
            margin-left: 15px;
            width: 400px;
        }
        #console {
            border:1px solid #CCCCCC;
            border-right-color:#33333333;
            border-bottom-color:#999999;
            height: 170px;
            overflow-y: scroll;
            padding: 5px;
            width: 100%;
        }
        #console p {
            padding: 0;
            margin: 0;
        }
    </style>
<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
<script type="text/javascript">
        var ws = null;
        var url = null;
        var transports = [];
        function setConnected(connected) {
            document.getElementById('connect').disabled = connected;
            document.getElementById('disconnect').disabled = !connected;
            document.getElementById('echo').disabled = !connected;
        }
        function connect() {
            if (!url) {            
			log('Select whether to use W3C WebSocket or SockJS');              
                return;
            }
            //ws = (url.indexOf('sockjs') != -1) ?new SockJS(url, undefined, {protocols_whitelist: transports}) : new WebSocket(url);
            if ('WebSocket'in window) {
                ws= new WebSocket("ws://localhost:8080/SpringSocketJs/websck");
            }else {
                ws = new SockJS("http://localhost:8080/SpringSocketJs/sockjs/websck/info");
            }
            //websocket = new SockJS("http://localhost:8084/SpringWebSocketPush/sockjs/websck");
            ws.onopen = function () {
                setConnected(true);
                //log('Info: connection opened.');
            };
            ws.onmessage = function (event) {              
                log('Received: ' + event.data);
            };
            ws.onclose = function (event) {
                setConnected(false);
                log('Info: connection closed.');
                log(event);
            };
        }
        function disconnect() {
            if (ws != null) {
                ws.close();
                ws = null;
            }
            setConnected(false);
        }
        function echo() {
            if (ws != null) {
                var message = document.getElementById('message').value;
                log('Sent: ' + message);
                ws.send(message);
            } else {
                alert('connection not established, please connect.');
            }
        }
        function updateUrl(urlPath) {
           if (urlPath.indexOf('sockjs') != -1) {
                url = urlPath;
                document.getElementById('sockJsTransportSelect').style.visibility ='visible';
            }
            else {
              if (window.location.protocol =='http:') {
                  url = 'ws://' + window.location.host + urlPath;
              } else {
                  url = 'wss://' + window.location.host + urlPath;
              }
              document.getElementById('sockJsTransportSelect').style.visibility ='hidden';
            }
        }
        function updateTransport(transport) {
          transports = (transport == 'all') ?  [] : [transport];
        }    
        function log(message) {
            var console = document.getElementById('console');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.appendChild(document.createTextNode(message));
            console.appendChild(p);
            while (console.childNodes.length > 25) {
               console.removeChild(console.firstChild);
            }
            console.scrollTop = console.scrollHeight;
        }
    </script>
</head>
<body>
<noscript><h2 style="color:#ff0000">Seems your browser doesn't supportJavascript!Websockets 
    rely on Javascript being enabled. Please enable
    Javascript and reload this page!</h2></noscript>
<div>
    <div id="connect-container">
        <input id="radio1"type="radio"name="group1"οnclick="updateUrl('/SpringSocketJs/websocket');">
            <label for="radio1">W3C WebSocket</label>
        <br>
        <input id="radio2"type="radio"name="group1"οnclick="updateUrl('/SpringSocketJs/sockjs/websocket');">
            <label for="radio2">SockJS</label>
        <div id="sockJsTransportSelect" style="visibility:hidden;">
            <span>SockJS transport:</span>
            <select οnchange="updateTransport(this.value)">
              <option value="all">all</option>
              <option value="websocket">websocket</option>
              <option value="xhr-polling">xhr-polling</option>
              <option value="jsonp-polling">jsonp-polling</option>
              <option value="xhr-streaming">xhr-streaming</option>
              <option value="iframe-eventsource">iframe-eventsource</option>
              <option value="iframe-htmlfile">iframe-htmlfile</option>
            </select>
        </div>
        <div>
            <button id="connect"οnclick="connect();">Connect</button>
            <button id="disconnect"disabled="disabled"οnclick="disconnect();">Disconnect</button>
        </div>
        <div>
           <textarea id="message"style="width:350px">Here is a message!</textarea>
        </div>
        <div>
            <button id="echo"οnclick="echo();"disabled="disabled">Echo message</button>
        </div>
    </div>
    <div id="console-container">
        <div id="console"></div>
    </div>
</div>
</body>
</html>


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
### 回答1: 好的。 建立一个 WebSocketdemo 示例的步骤如下: 1. 在服务器端安装 ws 模块: ```bash npm install --save ws ``` 2. 在服务器端创建一个 WebSocket 服务器: ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { console.log('新的连接已建立'); ws.on('message', (message) => { console.log(`收到消息:${message}`); }); ws.send('你好!已连接到服务器。'); }); ``` 3. 在客户端创建一个 WebSocket 客户端: ```javascript const socket = new WebSocket('ws://localhost:8080'); socket.onopen = () => { console.log('连接已建立'); socket.send('你好!我是客户端。'); }; socket.onmessage = (event) => { console.log(`收到消息:${event.data}`); }; socket.onclose = () => { console.log('连接已关闭'); }; ``` 这就是一个简单的 WebSocket 示例。希望这对你有帮助。 ### 回答2: WebSocket是一种基于TCP协议的全双工通信协议,它允许在单个连接上进行双向通信。下面我将以300字介绍如何构建一个WebSocket示例。 首先,我们需要使用一个支持WebSocket的编程语言或框架来实现示例。常见的选择包括JavaScript的WebSocket API、Python的Tornado框架、JavaSpring框架等。这里我选择使用JavaScript的WebSocket API来展示示例。 在前端,我们可以在HTML文件中创建一个WebSocket对象,通过指定服务器的地址创建WebSocket连接: ``` var socket = new WebSocket('ws://server-address'); ``` 在后端,我们可以使用Node.js来创建一个WebSocket服务器,监听指定的端口,并处理WebSocket的连接请求: ``` const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', function connection(ws) { ws.on('message', function incoming(message) { console.log('received: %s', message); }); ws.send('Hello, client!'); }); ``` 在示例中,当客户端与服务器建立WebSocket连接后,可以通过调用`send`方法向服务器发送消息,通过监听`message`事件来接收服务器发送的消息。服务器也可以通过调用`send`方法向客户端发送消息。 要运行示例,我们需要在本地搭建一个WebSocket服务器,并在浏览器中打开HTML文件来建立WebSocket连接。 通过这个示例,我们可以实现客户端和服务器之间的实时双向通信,使得数据的传输更加高效和即时。WebSocket的优点在于它能够降低网络延迟,减少数据传输的开销,并支持真正的双向通信。 以上就是关于如何构建一个WebSocket示例的简要介绍,希望对你有所帮助! ### 回答3: WebSocket是一种在Web应用程序中实现双向通信的协议。通过WebSocket,客户端和服务器可以实时地交换数据。以下是一个简单的WebSocketDemo: 首先,我们需要在服务器端创建一个WebSocket服务器。可以使用一些流行的编程语言和框架,如Node.js使用Socket.io,或者Python使用Tornado来实现。这里以Node.js为例: 1. 在服务器端,在命令行中安装Socket.io:npm install socket.io 2. 在服务器端创建一个Node.js文件,导入Socket.io并创建一个服务器对象: ```javascript const io = require('socket.io')(); io.on('connection', (socket) => { console.log('客户端已连接'); socket.on('message', (data) => { console.log('收到消息:', data); io.emit('message', data); }); }); io.listen(3000); console.log('WebSocket服务器已启动'); ``` 3. 在客户端,使用浏览器中提供的WebSocket API来与服务器建立连接并发送和接收消息。可以在HTML文件中添加以下代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WebSocket Demo</title> </head> <body> <h1>WebSocket Demo</h1> <input type="text" id="messageInput" placeholder="输入消息"> <button onclick="sendMessage()">发送</button> <ul id="messageList"></ul> <script> const socket = new WebSocket('ws://localhost:3000'); socket.onopen = function() { console.log('已连接到WebSocket服务器'); }; socket.onmessage = function(event) { const message = event.data; const listItem = document.createElement('li'); listItem.textContent = message; document.getElementById('messageList').appendChild(listItem); }; function sendMessage() { const input = document.getElementById('messageInput'); const message = input.value; socket.send(message); input.value = ''; } </script> </body> </html> ``` 以上代码通过创建一个WebSocket对象,并在与服务器成功建立连接后,监听消息的接收。当用户点击发送按钮时,JavaScript代码将用户输入的消息发送到服务器,并将服务器返回的消息添加到页面的消息列表中。 最后,可以运行服务器代码,在浏览器中打开HTML文件,就可以进行WebSocket的测试和交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值