一个简单的聊天小程序。基本功能已经实现,异常处理和流处理比较头疼
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、如果客户端关掉,服务器端如何知道对方已经把套接字关掉了?我查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();
} }
}
这里你不对
sleep(5000) 是让他睡5000毫秒 ,5000毫秒自动苏醒 ,你应该用 Thread.wait();使线程等待 ,只有Thread.notify();才能等待,
其实有个停止线程的方法Thread.stop()这个方法过时了(过时的东西建议不要用).
之后他会继续进入线程池和和其他运行线程争夺资源
如果是客户端调用的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,但只要服务器方没有继续发送数据,程序就会一直停在这里。
System.out.println("A client is quit!");第二个问题:楼上面说的都很对。sleep()只是睡着了,不是死掉了,既然是睡着了,那么就有醒过来的时候。
你可以把“死活不执行”那段代码放到finally{}里面试一试。