一个简单的聊天小程序。基本功能已经实现,异常处理和流处理比较头疼
1、如果客户端关掉,服务器端如何知道对方已经把套接字关掉了?我查api无果
2、客户端基本上已经完善了,但是有一个奇怪的问题:问题代码如下,关闭客户端时我在监听里让它掉一下exit()方法
将 isConnection置false,好让run()线程跳出循环,然后关闭相应的流,但是奇怪的是关闭流部分的代码死活不执行
我用了很多方法,甚至让主线程睡5秒,run()也没跳出那个循环正常结束,不知道什么原因public void exit() {// 关闭流及套接字等
isConnection = false;
try {
Thread.sleep(5000);//睡了run也不结束
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
exec.shutdown();
} // 实现了runnable接口的内部类,用来从服务器取信息---------------------------------------------------
private class Get_Message implements Runnable {// 从服务器取回message public void run() {
isConnection = true;
try {
while (isConnection) {
String message = in.readUTF();
if (message != null)
textArea.append(message + "\n");  
}//------------------------------------下面的死活不执行
System.out.println("退出循环");
in.close();
out.flush();
out.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

解决方案 »

  1.   

    Thread.sleep(5000);//睡了run也不结束 
    这里你不对
    sleep(5000) 是让他睡5000毫秒 ,5000毫秒自动苏醒 ,你应该用  Thread.wait();使线程等待 ,只有Thread.notify();才能等待,
    其实有个停止线程的方法Thread.stop()这个方法过时了(过时的东西建议不要用).
      

  2.   

    楼上朋友说的对,sleep方法只是让他休息一定时间
    之后他会继续进入线程池和和其他运行线程争夺资源
      

  3.   

    1、如果客户端关掉,服务器端如何知道对方已经把套接字关掉了?我查api无果 
    如果是客户端调用的close,则服务器端对应的接收语句会抛出异常。
    也可以双方约定一个协议(比如:客户端在关闭前向服务器发送一个特殊的字符串,这样双方都可以grace close)

    2、客户端基本上已经完善了,但是有一个奇怪的问题:问题代码如下,关闭客户端时我在监听里让它掉一下exit()方法 
    将 isConnection置false,好让run()线程跳出循环,然后关闭相应的流,但是奇怪的是关闭流部分的代码死活不执行 
    我用了很多方法,甚至让主线程睡5秒,run()也没跳出那个循环正常结束,不知道什么原因 public void run() { 
    isConnection = true; 
    try { 
    while (isConnection) { 
    String message = in.readUTF(); if (message != null) 
    textArea.append(message + "\n"); 
    }//------------------------------------下面的死活不执行 
    System.out.println("退出循环"); 
    in.close(); 
    out.flush(); 
    out.close(); 
    socket.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    红色的那句话是阻塞的,所以,虽然你设置了isConnection=false,但只要服务器方没有继续发送数据,程序就会一直停在这里。
      

  4.   

    第一个问题:客户端关闭,服务器端会抛出异常,你可以在异常里对它进行相应的处理。比如说打印一句话:
    System.out.println("A client is quit!");第二个问题:楼上面说的都很对。sleep()只是睡着了,不是死掉了,既然是睡着了,那么就有醒过来的时候。
    你可以把“死活不执行”那段代码放到finally{}里面试一试。
      

  5.   

    十分感谢谢谢各位的解答,其实wait---notify方式我也试过的,结果运行时异常,放到fianally块也试过,也是死活不执行,我想3楼的朋友是正解