Tomcat架设简单Websocket服务器

环境:
jdk 8
eclipse-oxygen
tomcat 7.088

  1. 在eclipse里建一个maven project 项目


    点击Next

    如上图,选那个maven-archetype-webapp,点Next

    在Group Id和Artifact Id处写名字,自己起,点Finish

    这样就建好了,先别管报错
    打开pom.xml,往里加内容

    加入:

    <dependency>
       <groupId>javax.websocket</groupId>
       <artifactId>javax.websocket-api</artifactId>
       <version>1.0</version>
       <scope>provided</scope>
    </dependency>

    再来解决报错的问题
    先在你的项目下新建个folder,libs

    找到你的 tomcat目录/lib/

    把上图中标示的两个jar包:serverlet-api.jar websocket-api.jar考到你刚建的libs文件夹中

    然后把这两个jar包Add to Build Path

    这样就不报错了,也就是说Websocket服务端开发的准备OK了。

下面就开始写服务端了

用的是注解注入,一个脚本就OK

package com.r.server;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

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

@ServerEndpoint("/ws")
public class WSServer
{
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;  

    private static ConcurrentHashMap<Session, WSServer> ssMap= new ConcurrentHashMap<Session, WSServer>();

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

    /**
     * 连接建立成功调用的方法
     * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        ssMap.put(session, this);
        addOnlineCount();           //在线数加1
        System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
    }  

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(){
        ssMap.remove(this.session);
        subOnlineCount();           //在线数减1
        System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
    }  

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
        WSServer tmp = ssMap.get(session);
        try {
            tmp.sendMessage(message);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }  

    /**
     * 发生错误时调用
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("发生错误");
        error.printStackTrace();
    }  

    /**
     * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
     * @param message
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException{
        this.session.getBasicRemote().sendText(message);
        //this.session.getAsyncRemote().sendText(message);
    }  

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }  

    public static synchronized void addOnlineCount() {
        WSServer.onlineCount++;
    }  

    public static synchronized void subOnlineCount() {
        WSServer.onlineCount--;
    }
}

这段代码也是从网上拷的,但是经过了我的修改

@ServerEndpoint("/ws")

这行代码表示的是在项目运行在tomcat服务器上时,这个websockt服务器的地址是:
ws://localhost:8080/web2/ws ,其中web2是之前建项目时的Artifect Id,本例是web2
这里每个session就是每个客户端的连接
ssMap是线程安全的Map,每当有客户端连接,就将客户端加入这个map中
原先的OnMessage方法,是收到消息后把消息群发给所有客户端,有点聊天室的意思,我把它改成,谁发的消息就发送回给谁

再修改index.jsp(这个就是测试用)

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>Java后端WebSocket的Tomcat实现</title>
</head>
<body>
    Welcome<br/><input id="text" type="text"/>
    <button onclick="send()">发送消息</button>
    <hr/>
    <button onclick="closeWebSocket()">关闭WebSocket连接</button>
    <hr/>
    <div id="message"></div>
</body>  

<script type="text/javascript">
    var websocket = null;
    //判断当前浏览器是否支持WebSocket
    if (‘WebSocket‘ in window) {
        //websocket = new WebSocket("ws://localhost:8080/web1/websocket");
        websocket = new WebSocket("ws://localhost:8080/web2/ws");
    }
    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 + ‘<br/>‘;
    }  

    //关闭WebSocket连接
    function closeWebSocket() {
        websocket.close();
    }  

    //发送消息
    function send() {
        var message = document.getElementById(‘text‘).value;
        websocket.send(message);
    }
</script>
</html>  

最后把项目添加到tomcat,运行tomcat(在eclipse中操作)

然后打开浏览器,360啊火狐啊Chrome啊之类的,输入这个项目的路径
http://localhost:8080/web2
这样会打开index.jsp
打开后页面自动连接websocket服务

发送消息,服务器接收到并会返回给客户端

点击关闭WebSocket连接会断开连接

这几项操作在Tomcat服务端也有显示

这就是简单的服务器端和测试jsp页面

原文地址:http://blog.51cto.com/shuxiayeshou/2133696

时间: 2024-10-07 18:23:27

Tomcat架设简单Websocket服务器的相关文章

基于tomcat运行HTML5 WebSocket echo例子

一:概述 作为HTML5新特性之一的WebSocket组件,在实时性有一定要求的WEB应用开发中还是有一定用武之地,高版本的IE.Chrome.FF浏览器都支持Websocket,标准的Websocket通信是基于RFC6455实现服务器端与客户端握手与消息接发的.如果对Websocket通信不是太理解,可以查看RFC文档即可,简单说就是通过发送HTTP请求,实现双方握手,将无状态的HTTP通信协议进一步升级成有状态的通信协议,同时Websocket还支持子协议选项与安全传输.标准的websoc

tomcat解析之简单web服务器(图)

链接地址:http://gogole.iteye.com/blog/587163 之前有javaeyer推荐了一本书<how tomcat works>,今天晚上看了看,确实不错,第一眼就着迷了. 于是乎就学着书上的例子敲了敲,学会了一个简单web服务器的大概实现,当然,这个简直就无法称之为web服务器,但是也算是走进web服务器的第一步吧. 这篇文章仅限于学习记录,文笔凌乱之处,还望各位见谅. OK,下面进入正题: 开始之前,首先我们要清楚以下几个内容. 首先,一个最简单服务器包括三个部分:

利用金山快盘和TortoiseSVN架设个人svn服务器

作为程序员,可能经常遇到这样的问题,想自己有一个公网的svn服务器,像公司的svn一样,存储自己的东西,还可以追溯版本,可是我们又不想花费购买公网服务器和ip,也不想自己架设服务器,映射公网(因为这样费电啊,也要花钱),那怎么办呢?很久之前看到一个类似的文章,当时看了后,觉得可行,但一直没有做,今天有时间,正好也想整理一下电脑上的文件了,同时又不想删除东西,就找一个存储的地方,然后就想到组一个这样的私人SVN了. 说下步骤吧: 1.下载金山快盘,next,安装 2.下载TortoiseSVN-1

根据Unix哲学来编写你的HTML5 Websocket服务器来实现全双工通信

websocketd代表WebSocket的守护进程 websocketd处理的是浏览器和服务器之间的WebSocket连接,它会启动你所指定的服务器端应用来对WebSockets进行处理,然后在浏览器和服务器应用之间进行消息的传递. 在20年前的话,有一项叫做CGI的技术做的工作类似,但现在这项技术将会被websocket所取代. 语言无关 只要你的服务器应用是可以从命令行进行运行的,你就可以为你的服务器应用编写WebSocket终端服务. 无需额外的库的支持 通过WebSocketd进行信息

python实现websocket服务器,可以在web实时显示远程服务器日志

一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上查看日志,非常麻烦,为了偷懒,能在页面点几下按钮完成工作,所以这几天查找了这方面的资料,实现了这个功能,瞬间觉的看日志什么的,太方便了,以后也可以给开发们查日志,再也不用麻烦运维了,废话少说,先看效果吧. 二.代码 在实现这功能前,看过别人的代码,发现很多都是只能在web上显示本地的日志,不能看远程

java实现简单web服务器(分析+源代码)

在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.为了简化操作,这里不考虑资源不存在等异常情况.web服务基于的是HTTP协议,用户在浏览器的地址栏输入要访问的地址,服务器如何得到该地址是个关键.先看下一般的HTTP请求和响应报文的一般格式: HTTP 请求报文 HTTP 响应报文 web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:

Tomcat如何实现WebSocket

WebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端和服务端实现双向通信.在客户端和服务器端建立一条WebSocket连接后,服务器端消息可直接发送到客户端,从而打破传统的请求响应模式,避免了无意义的请求.比如传统的方式可能会使用AJAX不断请求服务器端,而WebSocket则可以直接发送数据到客户端且客户端不必请求.同时,由于有了浏览器的原生支持,编写客户端应用程序也变得更加便捷且不必依赖第三方插件.另外,WebSocket协议摒弃了HTTP协议

WebSocket服务器 CshBBrain

转自:http://www.oschina.net/p/cshbbrain 宝贝鱼(CshBBrain) 是一个来自中国的简单的轻量级的高性能的WebSocket服务器.支持服务器集群,能满足大并发量高容量的分布式系统开发.如果你需要开发带有集群功能的WebSocket服务器,宝贝鱼(CshBBrain) 也许是非常适合你的选择.在宝贝鱼(CshBBrain)中你可以将某个服务器设置为纯粹的集群管理服务器,或纯粹的业务节点服务器和集群管理业务节点服务器3种类型.适合用于数据推送(股票行情),游戏

使用Node.js 和ws 模块构建WebSocket服务器

Node.js 中的ws 模块是最新的一个易用的.速度超快的web socket 实现,可以用来快速构建web socket 应用.其中还包含了wscat 命令行工具,可以用来模拟客户端或者服务器端. 在本实例中,我们将研究能够找到的最快的WebSocket 服务器.Node.js 中ws 模块不仅执行超快,而且使用也很简单.它实施方便,是本实例介绍Websocket 的理想选择. ws 模块很新,符合当前HyBi 协议草案,可以发送和接收数组类型数据(ArrayBuffer.Float32Ar