关闭客户端令服务器端报错的解决
一、问题描述:
多个客户端能访问一个服务器,能实现群聊。但是,当关闭一个客户端时,服务器会报错。报错为connect reset,后面则显示出错的位置。
二、解决方法:
提示 : 重点关注橘红色和注释部分
// 接收消息的方法
public String receive() {
sb.delete(0, sb.length());
try {
int info = is.read();
//当按钮被按下时则跳出循环(按钮监听器激活后会写入#*两个符号作为协议)
while ( !sb.toString().contains("#*")) {
sb.append((char)info);
info = is.read();
}
sb.delete(sb.length()-2, sb.length());
System.out.println(new String(sb.toString().getBytes(), "gb2312"));
return sb.toString();
} catch (IOException e) {
System.out.println(clientName+" is off-line!");
}
//1、我喜欢用try、catch来捕获异常,而不喜欢在整个方法或类的开头用declare来声明异常。因为用try、catch能做到更精细的发现异常。
2、 如果我没关闭客户端,这个receive()方法只会执行到上面的return sb.toString()这一语句后就跳出了receive()方法,而不会执行后面两句橘红色的语句。此时try、catch也不会发生作用,因为没发生异常。
3、当我关闭了一个客户端的时候,try{}里的代码就发生了异常,从而使try发挥了作用,此时,会忽略try{}里面的内容,直接执行catch{}里面的代码,很明显这会输出“某某用户下线”这样的语句。但receive()方法并没结束,因为上面的return sb.toString()被忽略掉了。因此会继续执行完后面的两个语句后才会结束。
judge=false;//这是关键所在,后面马上就会解释
return clientName+" is off-line!";
}
//显示客户端发来的消息
try {
while(judge){
//judge是我自己定义的一个boolean变量,初始值为true。很明显,这个循环会一直持续下去,直到judge变为false。而judge什么时候会变为false呢,当然是前面提到的receive()方法出现了异常情况(客户端关闭)后,而执行了倒数第二个语句时发生的。原来我没有设置judge这个变量,也没有receive()方法的倒数第二个语句。while循环的条件一直是true(而不是判断条件judge),结果就是当客户端关闭而发生异常后,会一直进行while循环里的内容,从而出现死循环。
content=receive();
jt_receive.append(clientName+" : "+content+"\n");
broadcast();
}
} catch (Exception e) {
// TODO: handle exception
}
socket.close();//关闭当前客户端
//如果不关的话,就会一直存在这个socket,从下面这个语句可判断socket是否已关闭
System.out.println("客户端关闭否:"+socket.isClosed());
Server.list.remove(this);//从队列中移除该客户端
//需记得将该客户端从队列中移除,否则当群发消息,总会遍历到这个已关闭的客户端,从而引发异常
} catch (Exception e) {
e.printStackTrace();
}
相关推荐
在本场景中,我们关注的是如何处理服务器端意外关闭后客户端的重连机制。 首先,让我们了解一下Socket的基本概念。Socket可以看作是两台计算机之间通信的端点,它允许应用程序发送和接收数据。在TCP/IP协议栈中,...
客户端支持(手机端可通往App store/Android市场下载): Android / iOS / PC 网页版 部署服务器支持: Linux / Windows / 虚拟空间 连接方式: HTTP轮询模式 / 长连接模式 DuckChat 通讯系统(开源IM系统)是一...
本文将详细讲解如何使用Indy 10中的IDTCPServer组件来构建服务器端,并处理客户端连接、断开以及解决断开时可能出现的错误问题。 首先,我们创建一个新的Delphi7项目,导入IDTCPServer组件。这个组件位于Indy 10的...
总结来说,解决“链接sqlserver报错ssl无法通过问题”主要涉及两部分:一是将Bouncy Castle的JAR文件添加到Java类路径,二是正确配置数据库连接字符串和服务器端SSL设置。通过这些步骤,可以确保Java应用程序与SQL ...
这样,无论是客户端还是服务器端都将统一使用指定的字符集,从而彻底解决因字符集不一致导致的中文数据插入失败问题。 综上所述,通过正确配置MySQL的字符集设置,可以有效地避免中文数据插入时出现的编码错误问题...
解决方法是检查客户端的 ip 和 port 是否正确,然后 ping 服务器端以确定是否可以连接。 java.net.SocketException: Socket is closed 该异常可能发生在客户端和服务器端,原因是主动关闭了连接后继续对网络连接...
Linux 下安装 MySQL 服务器 ...安装和配置 MySQL 服务器需要完成多个步骤,包括安装客户端和服务器端,设置数据库字符集和端口号,启动和停止服务,设置开机启动,解决启动报错问题,登录和忘记密码,允许远程访问等。
一旦客户端开始接收数据,即使用户取消下载,服务器端可能还在继续发送数据,这就是导致后台报错的原因。异常通常表现为IOException,因为服务器无法得知客户端是否已经关闭了连接。 为了解决这个问题,我们需要在...
1. 在服务器端检查服务是否启动。 2. 如果服务没有启动,手工启动即可。 3. 如果不能正常启动服务,可以用下面的方案解决: 问题现象 : 用友通服务无法启动,提示 : 本地计算机上的用友通服务启动后又停止了。 解决...
在Delphi编程环境中, Indy(Internet Direct)是一个强大的网络组件库,其中IDTCPServer是用于构建服务器端应用程序的关键组件。本文将深入探讨如何在Delphi中使用IDTCPServer组件处理客户端连接的建立与断开。 ...
这可能是由于服务器端的Keep-Alive timeout设置太小,导致连接被关闭。或者,客户端的Keep-Alive timeout设置太小,导致连接被关闭。 为了解决这个问题,我们可以尝试以下方法: 1. 增加服务器端的Keep-Alive time...
Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器端之间的连接断开后,导致连接的一端继续发送数据,引发该异常。 本文将详细介绍 Conexion reset by peer 的原因、解决方法和相关...
这涉及到多线程技术,因为在服务器端通常需要创建多个线程来单独处理每个客户端的连接,以保持并发性。 Socket编程涉及以下关键知识点: 1. **Winsock库**:这是Windows操作系统提供的用于实现Socket接口的动态...
* CLNTCONN:用于客户端的队列管理器,用于从服务器端获取消息。 选择合适的通道类型可以避免队列管理器的消息通道关闭,确保消息传递的可靠性。 MQ 异常关闭的原因主要是客户端程序设计不当、网络连接问题和 ...
这通常与浏览器设置、插件兼容性及服务器端配置有关。本文将详细介绍解决此类问题的具体步骤。 #### 步骤一:检查并调整IE浏览器设置 1. **确认IE版本**:首先确保您的浏览器版本为IE8或IE9。可以通过浏览器的帮助...
标题中的“C# Socket双终端通信源码”指的是使用C#编程语言实现的Socket网络通信程序,这种程序允许两个或更多的终端(客户端和服务器端)进行数据交换。Socket是网络编程的基本组件,它提供了进程间通信(IPC)的...
关于流量监控,此模块有异常,光查询时没有问题,关闭该功能时会报错。 远程桌面连接为系统自带功能项,具体使用方法请查询百度。 Client有禁止qq登录的功能。此功能耗费系统内存。 此系统的初步设想是将数据库...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让开发者可以使用JavaScript编写服务器端程序。WebSocket API在Node.js中有多种实现,如`ws`库,它是目前最常用的WebSocket库之一,提供了易于使用的接口来...
如果在703版本中,启动测试的服务器端出现自动关闭并报错,而控制台启动无问题,这可能需要现场应用补丁PT054300来解决问题。 3. 老版本工作流连接问题 连接老版本工作流时,可能会遇到版本不匹配的错误。要解决...