设为首页 收藏本站
查看: 655|回复: 0

[经验分享] Tomcat架设简单Websocket服务器

[复制链接]

尚未签到

发表于 2018-11-29 13:40:12 | 显示全部楼层 |阅读模式
  环境:
jdk 8
eclipse-oxygen
tomcat 7.088

  下面就开始写服务端了
  用的是注解注入,一个脚本就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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-641219-1-1.html 上篇帖子: Eclipse下Tomcat启动报错 下篇帖子: Tomcat服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表