package websocket;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.catalina.websocket.WebSocketServlet; import org.apache.catalina.websocket.StreamInbound;public class WebSocketMessageServlet extends WebSocketServlet{ /** * */ private static final long serialVersionUID = 1L; private String username; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.username = (String)req.getSession().getAttribute("user_nickname"); super.doGet(req, resp); } @Override protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest arg1) { // TODO Auto-generated method stub return new WebSocketMessageInboundPool(this.username); } }
package websocket;import java.io.IOException;import java.nio.CharBuffer;import java.nio.ByteBuffer;import java.util.HashMap;import java.util.Map;import org.apache.catalina.websocket.MessageInbound;import org.apache.catalina.websocket.WsOutbound;public class WebSocketMessageInboundPool extends MessageInbound{ private final String user_nickname; private static final Map<String,WebSocketMessageInboundPool > Connections = new HashMap<String,WebSocketMessageInboundPool>(); public WebSocketMessageInboundPool(String username){ this.user_nickname=username; } protected void onOpen(WsOutbound outbound) { // TODO Auto-generated method stub addMessageInbound(this); super.onOpen(outbound); } protected void onBinaryMessage(ByteBuffer arg0) throws IOException { // TODO Auto-generated method stub // 向所有已连接的客户端发送文本消息 try { //向特定的用户发送数据 WebSocketMessageInboundPool inbound = Connections.get(user_nickname); if(inbound != null){ ByteBuffer bb = ByteBuffer.wrap(arg0.array()); WsOutbound wb = inbound.getWsOutbound(); wb.writeBinaryMessage(bb); wb.flush(); } } catch (IOException e) { e.printStackTrace(); } } protected void onTextMessage(CharBuffer arg0) throws IOException { // TODO Auto-generated method stub try { //向特定的用户发送数据 WebSocketMessageInboundPool inbound = Connections.get(user_nickname); if(inbound != null){ CharBuffer cb = CharBuffer.wrap(arg0); WsOutbound wb = inbound.getWsOutbound(); wb.writeTextMessage(cb); wb.flush(); } } catch (IOException e) { e.printStackTrace(); } } protected void onClose(int status) { // TODO Auto-generated method stub removeMessageInbound(this); super.onClose(status); } //向连接池中添加连接 public static void addMessageInbound(WebSocketMessageInboundPool inbound){ //添加连接 Connections.put(inbound.user_nickname, inbound); } public static void removeMessageInbound(WebSocketMessageInboundPool inbound){ //移除连接 Connections.remove(inbound.user_nickname); }}
我的握手链接是ws = new WebSocket("ws://localhost:8080/websocket/web"); // 本地
xml配置:
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <servlet-name>WebSocketMessageServlet</servlet-name> <servlet-class>websocket.WebSocketMessageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>WebSocketMessageServlet</servlet-name> <url-pattern>/web</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
但是我本地tomcat测试了还是不行,
tomcat项目lib文件夹下的jar包全都要删掉吗?
回复讨论(解决方案)
up..........................
木有人会吗?
public class WebSocketMessageServlet extends WebSocketServlet{ protected StreamInbound createWebSocketInbound(String arg0) { System.out.println("$$$$$$$$"); return new WebSocketMessageInboundPool("1"); }
这样写就能握手,太奇怪了,明明要重载父类抽象方法才是正确的。
我在浏览器上F12看了一下,错误是这样说的
楼主你的xml配置有问题!

HTML的核心目的在于让浏览器理解并展示网页内容。1.HTML通过标签定义网页结构和内容,如、到、等。2.HTML5增强了多媒体支持,引入了和标签。3.HTML提供了表单元素,支持用户交互。4.优化HTML代码可提升网页性能,如减少HTTP请求和压缩HTML。

htmltagsareessentialforwebdevelopmentastheyandendenhancewebpages.1)heSdefinElayout,语义和互动性。2)SemantictagsiCtagSimproveCacsibilitieAndseo.3)pose poseriblesibilityAndseoandseo.3)poser

一致的HTML编码风格很重要,因为它提高了代码的可读性、可维护性和效率。1)使用小写标签和属性,2)保持一致的缩进,3)选择并坚持使用单引号或双引号,4)避免在项目中混合使用不同风格,5)利用自动化工具如Prettier或ESLint来确保风格的一致性。

在Bootstrap4中实现多项目轮播的解决方案在Bootstrap4中实现多项目轮播并不是一件简单的事情。虽然Bootstrap...

如何实现鼠标滚动事件穿透效果?在我们浏览网页时,经常会遇到一些特别的交互设计。比如在deepseek官网上,�...

无法直接通过CSS修改HTML视频的默认播放控件样式。1.使用JavaScript创建自定义控件。2.通过CSS美化这些控件。3.考虑兼容性、用户体验和性能,使用库如Video.js或Plyr可简化过程。

在手机上使用原生select的潜在问题在开发移动端应用时,我们常常会遇到选择框的需求。通常情况下,开发者倾...

在手机上使用原生select的弊端是什么?在移动设备上开发应用时,选择合适的UI组件是非常重要的。许多开发者�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具