当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

关闭客户端令服务器端报错的解决

发表于: 2014-03-15   作者:约巴拿   来源:转载   浏览:
摘要: 关闭客户端令服务器端报错的解决 一、问题描述:      多个客户端能访问一个服务器,能实现群聊。但是,当关闭一个客户端时,服务器会报错。报错为connect reset,后面则显示出错的位置。   二、解决方法:       提示 : 重点关注橘红色和注释部分

关闭客户端令服务器端报错的解决

一、问题描述:

     多个客户端能访问一个服务器,能实现群聊。但是,当关闭一个客户端时,服务器会报错。报错为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();
  }

关闭客户端令服务器端报错的解决

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1、创建一个模拟器( API level小于等于10,当时选择了很多模拟器,只有模拟器的android版本较低时,
常见错误与解决方案: 错误1、服务器重启后,自动停止 解决办法:一般查看E:\Program Files\Apache
一、实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编
实验三 UDP服务器端程序设计 一、实验目的 学习和掌握Linux下的UDP服务器基本原理和基本编程方法,
TCP服务器端和客户端程序设计 二、实验平台 Linux操作系统 三、实验内容 编写Linux下TCP服务器套接
关系图 客户端逻辑 【发送】逻辑管理器 (处理逻辑发送指令)→指令解析管理器(根据协议xml解析指
最近写了个PHP的SOAP 服务器 端,实现了PHP客户端的调用,却实现不了c#客户端的调用,看完了手册找
最近公司的同事业余时间搞了一个内部的类about.me(https://about.me/)的网站Ocelots,想来是一个
学习任何东西,我们只要搞清楚其原理,就会触类旁通。现在结和我所学,我想总结一下客户端到服务器
做b/s的东西,感觉首先要弄懂客户端与服务器端的交互原理(参考之前文章:http://blog.csdn.net/wan
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号