darkpoon 发表于 2018-11-29 13:40:12

Tomcat架设简单Websocket服务器

  环境:
jdk 8
eclipse-oxygen
tomcat 7.088


[*]在eclipse里建一个maven project 项目
http://i2.运维网.com/images/blog/201806/28/67e097b2f5c6caf4dacc96803e81f34b.png
http://i2.运维网.com/images/blog/201806/28/43e73dbe7aa4d682c8c23208fb38624b.png
点击Next
http://i2.运维网.com/images/blog/201806/28/42ae25d51609f4d7361902ae7e191f15.png
如上图,选那个maven-archetype-webapp,点Next
http://i2.运维网.com/images/blog/201806/28/0381a207740236d6074f7df2e47559af.png
在Group Id和Artifact Id处写名字,自己起,点Finish
http://i2.运维网.com/images/blog/201806/28/a146437ed5a679b38c684d5f32236b63.png
这样就建好了,先别管报错
打开pom.xml,往里加内容
http://i2.运维网.com/images/blog/201806/28/03624f98f79d84bc87f9f124d6d0c2e3.png
加入:

javax.websocket
javax.websocket-api
1.0
provided

  再来解决报错的问题
先在你的项目下新建个folder,libs
http://i2.运维网.com/images/blog/201806/28/7a2dc0c254babb9d0ff6a4c9583b1c18.png
找到你的 tomcat目录/lib/
http://i2.运维网.com/images/blog/201806/28/0c320c91dd2248065cec4489ca0f0343.png
把上图中标示的两个jar包:serverlet-api.jar   websocket-api.jar考到你刚建的libs文件夹中
http://i2.运维网.com/images/blog/201806/28/6b52fd42963bb05545656df2c97fff8b.png
然后把这两个jar包Add to Build Path
http://i2.运维网.com/images/blog/201806/28/5d90ff47e6bc9f83a6f8bf5c03212d9c.png
这样就不报错了,也就是说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 ssMap= new ConcurrentHashMap();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
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(这个就是测试用)





Java后端WebSocket的Tomcat实现


Welcome
发送消息

关闭WebSocket连接




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 + '';
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//发送消息
function send() {
var message = document.getElementById('text').value;
websocket.send(message);
}


  最后把项目添加到tomcat,运行tomcat(在eclipse中操作)
  然后打开浏览器,360啊火狐啊Chrome啊之类的,输入这个项目的路径
http://localhost:8080/web2
这样会打开index.jsp
打开后页面自动连接websocket服务
http://i2.运维网.com/images/blog/201806/28/45abdb314f9eebc88258db499f3fc405.png
发送消息,服务器接收到并会返回给客户端
http://i2.运维网.com/images/blog/201806/28/37066fcd487b4b3a637946fcfd879e27.png
点击关闭WebSocket连接会断开连接
http://i2.运维网.com/images/blog/201806/28/16d1991341ceba1130c13390a7af812d.png
  这几项操作在Tomcat服务端也有显示
http://i2.运维网.com/images/blog/201806/28/21734f771fc0181ccf000b74fe1bbabe.png
  这就是简单的服务器端和测试jsp页面



页: [1]
查看完整版本: Tomcat架设简单Websocket服务器