HTML5:WebSocket实现
admin
2023-06-11 15:01:56
0

搞定这个的过程远比想象的困难许多。网上许多教程,一一尝试,大多随着库版本的改变以及浏览器对协议支持的改变以失败告终,即使成功的也语焉不详,以下为步骤。

1. 运行环境

Java EE IDE

apache-tomcat-7.0.29(7.0.27之后才支持websocket)

IE(版本:10.0.9200.16384)

Firefox(版本:15.0)

Google Chrome(版本:23.0.1251.2)

 

2. 详细步骤

(1) 在Java EE IDE中,File->New->Dynamic Web Project,使其如下配置

Target runtime中必须是Apache Tomcat v7.0,并且最好是引用7.0.29(可在New Runtime中配置)

HTML5:WebSocket实现

注意,点击Next->,再点击Next->,如下图,注意勾选Generate web.xml deployment descriptor,点击Finish

HTML5:WebSocket实现

(2) 在Java Resources下src下New->Class,如下图

HTML5:WebSocket实现

再在src下New->Class,如下图

HTML5:WebSocket实现

下面贴上上述类的代码

 
package com.trump.web.servlet;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
public class EchoServlet extends WebSocketServlet {
private static final long serialVersionUID = -4104682919545889813L;
private Logger logger = Logger.getLogger(EchoServlet.class.getName());
private static List socketList = new ArrayList();
@Override
protected StreamInbound createWebSocketInbound(String subProtocol,
HttpServletRequest request) {
// TODO Auto-generated method stub
logger.info("receive ws request");
return new MyMessageInbound();
}
public static synchronized List getSocketList() {
return socketList;
}
}
 
package com.trump.web.servlet;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.logging.Logger;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;
public class MyMessageInbound extends MessageInbound {
private int userIdName = 0;
private Logger logger = Logger.getLogger(MyMessageInbound.class.getName());
public int getUserIdName() {
return userIdName;
}
protected void onOpen(WsOutbound outbound) {
super.onOpen(outbound);
userIdName = outbound.hashCode();
EchoServlet.getSocketList().add(this);
logger.info("Server onOpen");
}
protected void onClose(int status) {
EchoServlet.getSocketList().remove(this);
super.onClose(status);
logger.info("Server onClose");
}
// 有二进制消息数据到达,比如音频等文件传输
@Override
protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
logger.info("Binary Message Receive: " + buffer.remaining());
}
@Override
protected void onTextMessage(CharBuffer buffer) throws IOException {
String msgOriginal = buffer.toString();
int startIndex = msgOriginal.indexOf("!@#$%");
String nikeName = msgOriginal.substring(0, startIndex);
String textMsg = msgOriginal.substring(startIndex + 5);
// 将字符数组包装到缓冲区中
// 给定的字符数组将支持新缓冲区;即缓冲区修改将导致数组修改,反之亦然
String countMsg = EchoServlet.getSocketList().size() + "人同时在线";
logger.info("Server onTextMessage: " + countMsg + nikeName + ":"
+ textMsg);
String msg1 = nikeName + ": " + textMsg;
String msg2 = "我: " + textMsg;
for (MyMessageInbound messageInbound : EchoServlet.getSocketList()) {
CharBuffer msgBuffer1 = CharBuffer.wrap(msg1);
CharBuffer msgBuffer2 = CharBuffer.wrap(msg2);
WsOutbound outbound = messageInbound.getWsOutbound();
if (messageInbound.getUserIdName() != this.getUserIdName()) {
outbound.writeTextMessage(msgBuffer1);
outbound.flush();
} else {
outbound.writeTextMessage(msgBuffer2);
}
}
}
}
(3) 打开WebContent下WEB-INF下web.xml,编辑为
 


myWebSocket

index.html
index.htm
index.jsp
default.html
default.htm
default.jsp


echo
com.trump.web.servlet.EchoServlet


echo
*.ws

(4) 右击项目myWebSocket->Run As->Run on Server,如下图,点击Finish,

HTML5:WebSocket实现

可以看到Tomacat正常运行,如下图

HTML5:WebSocket实现

(5) 在任意位置新建一个客户端,命名为client.html,内容如下

 



Web Socket Demo




(6) OK!打开浏览器,输入http://localhost:8080/webSocketTest/client.html

HTML5:WebSocket实现

此时注意Tomcat打印出的信息,如下

HTML5:WebSocket实现

 

3. WebSocket之所以受关注,是因为它的服务器端能主动发消息给客户端,即MyMessageInbound中onOpen函数可以让服务器做想做的事情。

相关内容

热门资讯

佳乐奥普浴霸安装 佳乐奥普浴霸是一种常见的浴室电器,以下是一般的安装步骤:1. 准备工具和材料:确保你拥有安装浴霸所需...
地漏存水弯堵了怎么疏通-疏通卫... 地漏存水弯堵了怎么疏通-疏通卫生间地漏的方法首先是用水冲,可以先尝试着使用原先冲厕所的设备du多冲几...
地漏堵了怎么办?给你地漏疏通技... 地漏堵了怎么办?给你地漏疏通技巧1、苏打加醋疏通法:先把半杯熟苏打粉倒入下水道,再倒半杯醋,苏打与醋...
地漏总是堵塞怎么办?如何预防地... 地漏总是堵塞怎么办?如何预防地漏堵塞?1、苏打和醋混合疏通法:相信苏打和醋这两种东西大家都不陌生了,...
请教下集成灶十大品牌金帝集成灶... 最佳回答 根据这个has_none_intro来判断是否有个人简历然后样式不同显示--> 2020-...
南方各省这轮受灾,小城市惨遭精... 今年刚到五月下旬,强降雨已经让长江沿线的上亿人领教了大自然的狂暴。多轮极端暴雨砸下来,山洪暴发、河水...
大突破!华为最新宣布轰动世界 华为今天成为全球明星。它正式发表命名为“韬(τ)定律”的半导体研制新定律,并表示预计到2031年,基...
远航1.4万公里!韩国军工在加... 据韩国《朝鲜日报》和加拿大广播公司(CBC)24日报道,韩国“岛山安昌浩”号潜艇完成跨太平洋航行,于...
开放空域、场景上新、金融护航…... 深圳新闻网2026年5月25日讯(记者 刘玉莲)10分钟送达的“奶茶空投”,百米高空的CBD全景巡航...
AI算力引爆供需失衡,光纤交货... 人工智能训练和推理集群对互联架构的密度要求远超传统云基础设施,这使得作为数据传输关键介质的光纤陷入了...