java websocket 案例_java websocket 简单使用【案例】

现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发

出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏

览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占

用很多的带宽。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。

一、什么是WebSocket API?

WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的

客户端和服务器程序。WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等

浏览器的支持。

WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以

Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域

的限制,而WebSocket允许跨域通信。

Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

那么我就开始我在项目中对websocket的使用。这里我创建了一个基于maven 的web Project

27a4e75a46c3620201bacce92b5ee7ea.png

基于J2EE7的jar以及websocket的核心api。websocket必须基于tomcat7.4以上版本,这里使用了tomcat8

只需要一个 WebSocketTest.java  和  一个 index.jsp文件即可实现:

1 package com.cn.zym.websocket;2

3 import java.io.IOException;4 import java.util.concurrent.CopyOnWriteArraySet;5

6 import javax.websocket.OnClose;7 import javax.websocket.OnMessage;8 import javax.websocket.OnOpen;9 import javax.websocket.OnError;10 import javax.websocket.server.ServerEndpoint;11

12 /**13 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,14 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端15 */

16 @ServerEndpoint("/websocket")17 public classWebSocketTest {18 //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。

19 private static int onlineCount = 0;20

21 //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。22 //若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识

23 private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();24

25 //与某个客户端的连接会话,需要通过它来给客户端发送数据

26 privateSession session;27

28 /**29 * 连接建立成功调用的方法30 * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据31 */

32 @OnOpen33 public voidonOpen(Session session){34 this.session =session;35 webSocketSet.add(this); //加入set中

36 addOnlineCount(); //在线数加1

37 System.out.println("有新连接加入!当前在线人数为" +getOnlineCount());38 }39

40 /**41 * 连接关闭调用的方法42 */

43 @OnClose44 public voidonClose(){45 webSocketSet.remove(this); //从set中删除

46 subOnlineCount(); //在线数减1

47 System.out.println("有一连接关闭!当前在线人数为" +getOnlineCount());48 }49

50 /**51 * 收到客户端消息后调用的方法52 * @param message 客户端发送过来的消息53 * @param session 可选的参数54 */

55 @OnMessage56 public voidonMessage(String message, Session session) {57 System.out.println("来自客户端的消息:" +message);58 //群发消息

59 for(WebSocketTest item: webSocketSet){60

61 try{62 item.sendMessage(message);63 } catch(IOException e) {64 e.printStackTrace();65 continue;66 }67 }68 }69

70 /**71 * 发生错误时调用72 * @param session73 * @param error74 */

75 @OnError76 public voidonError(Session session, Throwable error){77 System.out.println("发生错误");78 error.printStackTrace();79 }80

81 /**82 * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。83 * @param message84 * @throws IOException85 */

86 public voidsendMessage(String message) throws IOException{87 this.session.getBasicRemote().sendText(message);88 //this.session.getAsyncRemote().sendText(message);

89 }90

91 public static synchronized intgetOnlineCount() {92 returnonlineCount;93 }94

95 public static synchronized voidaddOnlineCount() {96 WebSocketTest.onlineCount++;97 }98

99 public static synchronized voidsubOnlineCount() {100 WebSocketTest.onlineCount--;101 }102 }

需要注意一点,在创建WebSocket实例的时候改地址目前的拼接方式为:ws://localhost:8080/设置好的项目访问规则/@ServerEndpoint注解的值

批注:

Java后端WebSocket的Tomcat实现

发送消息


关闭WebSocket连接


var websocket = null;//判断当前浏览器是否支持WebSocket

if ('WebSocket' inwindow) {

websocket= new WebSocket("ws://localhost:8080/jws/websocket");//websocket = new WebSocket("ws://echo.websocket.org", ["com.kaazing.echo","example.imaginary.protocol"])

}else{

alert('当前浏览器 Not support websocket')

}//连接发生错误的回调方法

websocket.onerror =function () {

setMessageInnerHTML("WebSocket连接发生错误");

};//连接成功建立的回调方法

websocket.onopen =function () {

setMessageInnerHTML("WebSocket连接成功");

}//接收到消息的回调方法

websocket.onmessage = function (event) {

setMessageInnerHTML(event.data);

}//连接关闭的回调方法

websocket.onclose =function () {

setMessageInnerHTML("WebSocket连接关闭");

}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。

window.onbeforeunload =function () {

closeWebSocket();

}//将消息显示在网页上

function setMessageInnerHTML(innerHTML) {

document.getElementById('message').innerHTML += innerHTML + '
';

}//关闭WebSocket连接

function closeWebSocket() {

websocket.close();

}//发送消息

function send() {var message = document.getElementById('text').value;

websocket.send(message);

}

学习笔记,效果就不演示了,贴上demo下载:

链接:http://pan.baidu.com/s/1kUW6hVL 密码:a6ag

具体websocket API参考:http://www.cnblogs.com/Leo_wl/p/5377767.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring MVC中整合WebSocket并获取请求参数,可以按照以下步骤进行: 1. 添加Maven依赖 ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>5.2.3.RELEASE</version> </dependency> ``` 2. 配置WebSocket 在Spring MVC的配置类中添加WebSocket配置: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/websocket").setAllowedOrigins("*"); } @Bean public WebSocketHandler myHandler() { return new MyHandler(); } } ``` 其中,`MyHandler`是自定义的WebSocket处理器。 3. 实现WebSocket处理器 实现`WebSocketHandler`接口,并在`afterConnectionEstablished`方法中获取请求参数: ```java public class MyHandler implements WebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { Map<String, String> queryParams = getQueryParams(session); // 处理WebSocket连接建立后的逻辑 } private Map<String, String> getQueryParams(WebSocketSession session) { URI uri = session.getUri(); String query = uri.getQuery(); return parseQuery(query); } private Map<String, String> parseQuery(String query) { Map<String, String> queryParams = new HashMap<>(); if (query != null) { String[] parts = query.split("&"); for (String part : parts) { String[] keyValue = part.split("="); if (keyValue.length == 2) { String key = keyValue[0]; String value = keyValue[1]; queryParams.put(key, value); } } } return queryParams; } // 其他WebSocketHandler接口的实现 // ... } ``` 在`getQueryParams`方法中,通过`WebSocketSession`对象的`getUri`方法获取请求的URI,再通过`parseQuery`方法解析出参数。 4. 客户端发送请求 在客户端使用WebSocket发送请求时,可以在URL后面添加参数: ```javascript var socket = new WebSocket("ws://localhost:8080/websocket?param1=value1&param2=value2"); ``` 这样,在WebSocket连接建立后,`MyHandler`中的`afterConnectionEstablished`方法就能够获取到这些参数了。 以上就是在Spring MVC中整合WebSocket并获取请求参数的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值