在客户端要关闭socket之前需要先通过发送消息告诉服务器端:
//通知服务器端关闭socket
pw.println(version + author + time + "bye" + end);
1、服务器端收到消息后转发消息给客户端关闭socket的消息并关闭,并退出while循环或者结束该socket的接收线程:
- while(true){
- try {
- //等待客户端的连接
- ss=s.accept();
- InputStreamReader isr=new InputStreamReader(ss.getInputStream());
- BufferedReader br=new BufferedReader(isr);
- pw=new PrintWriter(ss.getOutputStream(),true);
- while(true)
- {
- String info=br.readLine();
- Protocol pro = new Protocol();
- String result = pro.analyzing(info);
- if(result == "pzx" ){
- if(pro.getMessage_text().equals("bye")) {
- //服务器端转发给客户端socket关闭中,也可不转发直接在接受到消息前客户端自动关闭,也不需要第二步了
- pw.println("ok");
- pw.close();
- br.close();
- isr.close();
- ss.close();
- break; //退出服务器的接收循环,但还在等待客户端的连接
- } else {
- jta.append("客户端对服务器说("+pro.getDateTime()+"):/r/n"+" "+pro.getMessage_text()+"/r/n");
- }
- } else {
- jta.append("来自客户端的非法消息:"+result+"/r/n");
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
2、客户端收到消息后关闭接收线程,关闭资源:
- while(true)
- {
- //不停地读取从服务器端发来的信息
- String info;
- try {
- info = br.readLine();
- if(info.equals("ok")) {
- //如果接收到客户端的关闭消息,则结束接收的线程,s,pw,br此时都为空,最好关闭它们
- // pw.close();
- // br.close();
- // s.close();
- // System.out.println("服务器端socket已经断开");
- break;
- // System.exit(0);
- } else {
- mc.jta.append("服务器对客户端说:/r/n"+" "+info+"/r/n");
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }