Tomcat中实现websocket和browser端访问

本文介绍如何在Tomcat 7.0.27及以上版本中实现WebSocket服务,并提供了一个简单的聊天示例。服务端通过注解实现消息处理,客户端则使用JavaScript进行连接与交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tomcat中实现websocket和browser端访问

简介:

在tomcat 7.0.27版本后,实现了对websocket的支持。在最新的tomcat7.0.72后,websocket的开发变动更简单了
在tomcat中,websocket的支持有2个jar包提供:websocket-api.jar和tomcat-websocket.jar。

开发

实现websocket处理的类,可以继承javax.websocket.Endpoint;也可以使用注解来进行websocket服务的开发,这样更简单。

简单一个chat的示例:
package com.wssample;

import java.io.IOException;
import java.util.*;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/chatendpoint")
public class ChatEndpoint {
    //static final Logger logger = Logger.getLogger(ChatEndpoint.class);
    static Map<String,Session> sessionMap = new Hashtable<String,Session>();

    @OnOpen
    public void start(Session session){
        System.out.println("Guest"+session.getId()+" join");
        sessionMap.put(session.getId(), session);
        broadcast("Guest" + session.getId() + " join.");
    }

    @OnMessage
    public void process(Session session, String message){
        System.out.println(session.getId()+" say: " + message);
        broadcast("Guest"+session.getId()+" [say]: "+message);
    }


    @OnClose
    public void end(Session session){
        System.out.println("Guest"+session.getId()+" out.");
        sessionMap.remove(session.getId());
        broadcast("Guest"+session.getId()+ " out.");
    }

    @OnError
    public void error(Session session, java.lang.Throwable throwable){
        System.err.println("Guest" + session.getId() + " error: " + throwable);
        end(session);
    }

    void broadcast(String message){
        RemoteEndpoint.Basic remote = null;
        Set<Map.Entry<String,Session>> set = sessionMap.entrySet();
        for(Map.Entry<String,Session> i: set){
            remote = i.getValue().getBasicRemote();
            try {
                remote.sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

服务端开发,使用注解@ServerEndpoint,标示一个websocket服务端。注解参数value可以指定访问的路径。
在实现类中,使用注解@OnOpen,@OnClose, @OnMessage,@OnError来标示websocket生命周期的4个处理。

浏览器端

在浏览器端,使用js访问websocket访问,进行交互。

<!DOCTYPE html>
<html>
<head>
    <title>chatendpoint.html</title>
    <script language="JavaScript">
        var wsuri = "ws://localhost:8080/WebSocket/chatendpoint";
        var ws = null;

        function connectEndpoint(){
            window.WebSocket = window.WebSocket || window.MozWebSocket;
            if (!window.WebSocket){
                alert("WebSocket not supported by this browser");
                return;
            }

            ws = new WebSocket(wsuri);
            ws.onmessage = function(evt) {
                //alert(evt.data);
                var old = document.getElementById("echo").value;
                document.getElementById("echo").value = old+evt.data+"\r\n";
            };

            ws.onclose = function(evt) {
                //alert("close");
                document.getElementById("echo").value = "server disconnect.\r\n";
            };

            ws.onopen = function(evt) {
                //alert("open");
                document.getElementById("echo").value = "connect server.\r\n";
            };
        }

        function sendmsg(){
            ws.send(document.getElementById("send").value);
        }
    </script>
</head>
<body onload="connectEndpoint()">
<input type="text" size="20" value="hi~" id="send"> <input type="button" value="send" onclick="sendmsg()"> <br>
<textarea id="echo"  rows="50" cols="50">
</textarea>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值