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은 TO 등과 같은 태그를 통해 웹 페이지 구조와 컨텐츠를 정의합니다. 2. HTML5는 멀티미디어 지원을 향상시키고 소개 및 태그를 향상시킵니다. 3.html은 사용자 상호 작용을 지원하기위한 양식 요소를 제공합니다. 4. HTML 코드를 최적화하면 HTTP 요청 감소 및 HTML 압축과 같은 웹 페이지 성능이 향상 될 수 있습니다.

htmltagsareessentialforwebdevelopmentasthuctureandenhancewebpages.1) thefinelayout, semantics 및 internactivity.2) semantictagsimproveAccessibility 및 sseo.3) appleasoftagscanoptimizeperformanceandenseRocRossercompatiber.

일관된 HTML 인코딩 스타일은 코드의 가독성, 유지 가능성 및 효율성을 향상시키기 때문에 중요합니다. 1) 소문자 태그 및 속성 사용, 2) 일관된 압입 유지, 3) 단일 또는 이중 인용문을 선택하고 고수하십시오. 4) 프로젝트에서 다양한 스타일을 혼합하지 않으십시오.

솔루션 Bootstrap4에서 다중 프로 젝트 회전 목마를 구현하는 것은 부트 스트랩 4에서 멀티 프로 젝트 회전 목마를 구현하는 것은 쉬운 일이 아닙니다. 부트 스트랩 ...

마우스 스크롤링 이벤트 침투의 효과를 달성하는 방법은 무엇입니까? 웹을 탐색하면 종종 특별한 상호 작용 디자인이 발생합니다. 예를 들어, DeepSeek 공식 웹 사이트에서 � ...

HTML 비디오의 기본 재생 제어 스타일은 CSS를 통해 직접 수정할 수 없습니다. 1. JavaScript를 사용하여 사용자 정의 컨트롤을 만듭니다. 2. CSS를 통해 이러한 통제를 아름답게합니다. 3. video.js 또는 plyr와 같은 라이브러리를 사용하여 호환성, 사용자 경험 및 성능을 고려하면 프로세스를 단순화 할 수 있습니다.

휴대 전화에서 기본 선택을 사용하는 데있어 잠재적 인 문제는 모바일 애플리케이션을 개발할 때 종종 상자를 선택해야 할 필요가 있습니다. 일반적으로 개발자 ...

휴대 전화에서 기본 선택을 사용하는 단점은 무엇입니까? 모바일 장치에서 애플리케이션을 개발할 때는 올바른 UI 구성 요소를 선택하는 것이 매우 중요합니다. 많은 개발자 ...


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.