关于客户端断开连接后服务器抛出异常Connection reset

学习了socket  ,在做一个类似qq的c/s结构的聊天软件。发现了一个问题

就是在客户端与服务器通信后,服务器为客户端开启一个线程,使用while(true)循环时刻监听是否有通信。

在界面开启时没有任何异常,可是当界面关闭 就一直抛出异常了。

开启线程代码如下:


异常内容如下:


java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:113)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at cn.edu.xynu.socket.ClientThread.run(ClientThread.java:22)

仔细想想,或许在客户端关闭后  socke是t断开了,可是服务器为客户端已经开启的线程还在执行。

所以要处理一下异常。

在为客户端开启的线程里面定义一个布尔型变量,isOnline=true

在为客户端监听时while(true)修改为while(isOnLine)

如果出现异常,即客户端退出,isOnLine赋值为false。

完美解决了这个问题~~

发布了630 篇原创文章 · 获赞 1125 · 访问量 199万+
展开阅读全文

使用tomcat8写了个webSocket聊天室,出现如下异常

03-02

![图片说明](https://img-ask.csdn.net/upload/201703/02/1488426025_623561.png) 如图,在本地运行无异常,上传至阿里云服务器后开始时无异常,等待一段时间(推测是session timeout后)出现如图异常 package com.project.webSocket; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import javax.websocket.EndpointConfig; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import org.json.JSONException; import org.json.JSONObject; import org.springframework.web.context.support.WebApplicationContextUtils; import com.project.service.Manager; import com.project.service.impl.ManagerImpl; import com.project.utils.GetHttpSessionConfigurator; //@ServerEndpoint注解表示将 WebSocket服务端运行在 以ws://开头的访问端点 @ServerEndpoint(value = "/SocketServer",configurator = GetHttpSessionConfigurator.class) public class SocketServer{ private static final long serialVersionUID = 1L; //将httpSession,socketSession放在一个map里,代表一个用户 private static final HashMap<HttpSession,SocketServer> onlineUsers = new HashMap<HttpSession,SocketServer>(); private static int onlineCount = 0; //定义客服人员的名字(对应cookie--user_id) private static String customerService1 = "A002"; private static String customerService2 = "A003"; private HttpSession httpSession; /** * WebSocket Session */ private Session session; //使用 ServerEndpoint 注释的类必须有一个公共的无参数构造函数 public SocketServer() { } /** * 打开连接 * * @param session */ @OnOpen public void onOpen(Session session,EndpointConfig config) { this.session = session; this.httpSession = (HttpSession)config.getUserProperties().get(HttpSession.class.getName()); httpSession.setMaxInactiveInterval(60000); if(httpSession.getAttribute("user") != null){ onlineUsers.put(httpSession, this); } addOnlineCount(); System.out.println("++++当前人数" + onlineUsers.size()); System.out.println(httpSession.getAttribute("user")); } /** * 关闭连接 */ @OnClose public void onClose() { onlineUsers.remove(httpSession,this);//从map中删除 subOnlineCount(); System.out.println("----当前人数" + onlineUsers.size()); } /** * 错误信息响应 * * @param throwable */ @OnError public void onError(Throwable throwable) { System.out.println("连接异常"); System.out.println(throwable.getMessage()); } 请问是什么问题造成的? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 点我我会动 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览