ebSocket.之.基础入门-断开连接处理

在《WebSocket.之.基础入门-后端响应消息》的代码基础之上,继续更新代码。代码只改动了:TestSocket.java 和 index.jsp 两个文件。

先说问题:

  当前后端建立连接之后,如果此时关闭浏览器,或者点击浏览器的回退。只要退出了建立连接的页面。后台程序是会报错的。分别如下图所示:

  正常建立连接页面:

  

  

  

  

  现在退出当前建立连接的页面,后台日志如下所示:

 当前session的id是:0
从前端页面传过来的数据是:早上好..
3 十月 14, 2018 8:52:41 上午 org.apache.tomcat.websocket.pojo.PojoEndpointBase onError
4 严重: No error handling configured for [com.charles.socket.TestSocket] and the following error occurred
5 java.io.IOException: java.util.concurrent.ExecutionException: java.net.SocketException: Software caused connection abort: socket write error
6 at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:286)
7 at org.apache.tomcat.websocket.WsSession.sendCloseMessage(WsSession.java:572)
8 at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:495)
9 at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:348)
10 at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:290)
11 at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:131)
12 at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:67)
13 at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:204)
14 at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:203)
15 at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:93)
16 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:635)
17 at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
18 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
19 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
20 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
21 at java.lang.Thread.run(Thread.java:748)
22 Caused by: java.util.concurrent.ExecutionException: java.net.SocketException: Software caused connection abort: socket write error
23 at org.apache.tomcat.websocket.FutureToSendHandler.get(FutureToSendHandler.java:120)
24 at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:281)
25 ... 15 more
26 Caused by: java.net.SocketException: Software caused connection abort: socket write error
27 at java.net.SocketOutputStream.socketWrite0(Native Method)
28 at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
29 at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
30 at org.apache.coyote.http11.upgrade.BioServletOutputStream.doWrite(BioServletOutputStream.java:38)
31 at org.apache.coyote.http11.upgrade.AbstractServletOutputStream.writeInternal(AbstractServletOutputStream.java:153)
32 at org.apache.coyote.http11.upgrade.AbstractServletOutputStream.write(AbstractServletOutputStream.java:121)
33 at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.onWritePossible(WsRemoteEndpointImplServer.java:94)
34 at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:81)
35 at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:456)
36 at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:344)
37 at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:276)
38 ... 15 more

  

  现在开始处理上面的异常

TestSocket.java

 package com.charles.socket;

 import java.io.IOException;

 import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint; @ServerEndpoint(value = "/helloSocket")
public class TestSocket { /***
* 当建立链接时,调用的方法.
* @param session
*/
@OnOpen
public void open(Session session) { System.out.println("开始建立了链接...");
System.out.println("当前session的id是:" + session.getId());
} /***
* 处理消息的方法.
* @param session
*/
@OnMessage
public void message(Session session, String data) { System.out.println("开始处理消息...");
System.out.println("当前session的id是:" + session.getId());
System.out.println("从前端页面传过来的数据是:" + data); String message = "你好,我是后端程序...";
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
} } /***
* 处理断开连接的方法.
* @param session
*/
@OnClose
public void close(Session session) {
System.out.println("Session-ID是:"+session.getId() + ",退出了系统...欢迎下次再来...");
} }

index.jsp 代码

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Charles-WebSocket</title> <script type="text/javascript"> var websocket = null;
var target = "ws://localhost:8080/websocket/helloSocket"; function buildConnection() { if('WebSocket' in window) {
websocket = new WebSocket(target);
} else if('MozWebSocket' in window) {
websocket = MozWebSocket(target);
} else {
window.alert("浏览器不支持WebSocket");
} // 添加监听消息的方法
websocket.onmessage = function(event) {
console.log(event)
console.log(event.data)
document.getElementById("serverMsg").innerHTML = "<p>后端消息 :"+ event.data +"</p>"
} // 监听断开连接的方法.
websocket.onclose = function(event) {
// 如没有业务需求,可以不写这个关闭监听的方法.
// 业务需求,例如:聊天室,当某人退出的时候,会给出提示,xxx退出了...
}
} // 退出系统时, 关闭建立的WebSocket链接
window.onbeforeunload = function () {
websocket.close();
} // 往后台服务器发送消息.
function sendMessage() { var sendmsg = document.getElementById("sendMsg").value;
console.log("发送的消息:" + sendmsg); // 发送至后台服务器中.
websocket.send(sendmsg);
} </script>
</head>
<body> <button onclick="buildConnection();">开始建立链接</button>
<hr>
<input id="sendMsg" /> <button onclick="sendMessage();">消息发送</button>
<div id="serverMsg"></div> </body>
</html>

访问浏览器,输入地址:http://localhost:8080/websocket

建立连接,发送消息,然后在退出,在发送消息,在退出

在次访问系统..并退出...

系统正常运行,异常信息(... Caused by: java.net.SocketException: Software caused connection abort: socket write error.. )解决.

如有问题,欢迎纠正!!!

如有转载,请标明源处:https://www.cnblogs.com/Charles-Yuan/p/9785147.html

WebSocket.之.基础入门-断开连接处理的更多相关文章

  1. WebSocket.之.基础入门-建立连接

    WebSocket.之.基础入门-建立连接 1. 使用开发工具(STS.Eclipse等)创建web项目.如下图所示,啥东西都没有.一个新的web项目. 2. 创建java类.index.jsp页面. ...

  2. WebSocket.之.基础入门-前端发送消息

    WebSocket.之.基础入门-前端发送消息 在<WebSocket.之.基础入门-建立连接>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 index. ...

  3. WebSocket.之.基础入门-后端响应消息

    WebSocket.之.基础入门-后端响应消息 在<WebSocket.之.基础入门-前端发送消息>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 inde ...

  4. Arduino基础入门—3.连接 IIC 1602 LCD显示文字

    1. IIC转接板介绍 Arduino Uno R3开发板的外部IO口是非常有限的.在驱动LCD1602时,尽管我们的数据线使用了4线,相对于8线方式减少一半,但是在需要外接多种传感器的应用中,4线驱 ...

  5. WebSocket断开原因、心跳机制防止自动断开连接

    1.断开原因 WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来. ws.onclose = function (e) { console.log('websocket ...

  6. Mongoose基础入门

    前面的话 Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具.本文将详细介绍如何使用Mongoose来操作MongoDB NodeJS驱动 在介绍Mongoose之 ...

  7. Linux基础入门教程

    Linux基础入门教程 --------- Linux学习路径 Linux学习者,常常不知道自己改怎么学习linux:Linux初级,也就是入门linux前提是需要有一些计算机硬件相关的知识或是有一下 ...

  8. C# 消息队列之 RabbitMQ 基础入门

    Ø  简介 C# 实现消息队列的方式有很多种,比如:MSMQ.RabbitMQ.EQueue 等,本文主要介绍使用 RabbitMQ 实现消息队列的基础入门.包括如下内容: 1.   什么是消息队列? ...

  9. Linux 究级基础入门命令整理

    Linux 究级基础入门命令整理 条条框框,三三两两,怎讷个这么多,哈哈!no zuo no die. 纯粹个人菜鸟笔记,望大神笑纳! 后续,未完!! 查看系统信息 uname -a - 查看内核/操 ...

随机推荐

  1. python中的os.path.dirname(__file__)的使用

    在编程时,我们要获取当前文件所在的路径,以适合所有的工程,建立相对路径. python的os.path.dirname(__file__)非常好用,建议大家使用: import os FILE = o ...

  2. iOS开发尺寸记录

    https://kapeli.com/cheat_sheets/iOS_Design.docset/Contents/Resources/Documents/index https://help.ap ...

  3. DRBD数据镜像与搭建

    一.数据安全工具DRDB 1. 数据镜像软件DRDB介绍 分布式块设备复制,是基于软件.基于网络的块复制存储解决方案 作用:用于服务器之间的磁盘.分区.逻辑卷等进行数据镜像. 例如:当用户将数据写入本 ...

  4. en-zh(社会问题)social problems

    The world's richest man, Amazon founder Jeff Bezos, and his wife MacKenzie have agreed a record-brea ...

  5. 表单中Readonly和Disabled的区别:readonly在get和post可传值到后端,disabled不可

    http://www.nowamagic.net/html/html_ReadonlyAndDisabled.php Readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能 ...

  6. [math] 绘制空间几何体的直观图

    这么多年,一直凭着从天而降的神来之灵感画着立体图. 而今才知道在二维平面上绘制空间几何体的直观图也是有方法的.叫做“画法几何” 1. 斜二测图 就是倾斜y轴,使y轴与x轴成45度的夹角.见: http ...

  7. day-2 jmeter 操作mysql数据库

    1)  导入jdbc的jar包,因为jmeter本身不能直接连接mysql,所以需要导入第三方的jar包,来连接mysql 2)       创建数据库连接配置,mysql的url.端口号.账号.密码 ...

  8. java 之程序中的http请求

    背景 java程序中有时需要我们发起http级别的请求,例如抓数据或者第三方对接时,一般分为两种:一种是只需我们发起请求,还有一种是我们不但要发起请求,还要拿到请求后的数据来进行下一步处理 实现 针对 ...

  9. 【Python全栈-数据库】数据库基础

    数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...

  10. 【PyQt5-Qt Designer】在GUI中使用pyqtgraph绘图库

    pyqtgraph绘图库 1.1 简介: pyqtgraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于内部实现方式上,使用了高速计算的numpy信号处理库以 ...