要实现的东西是很基本的,但是不知道到底错在哪里。为便于描述问题,写如下代码模拟之。
故障现象:
服务器用户服务类的run()方法中的while(true)循环里面,每次接受到用户的命令都会打印出该命令;
但当客户端关闭gui窗口时候,客户端发送了cmdExit,但是服务器端没有接受到。进而引发异常。客户端流程:1.客户给服务发请求连接,建立连接
2.客户给服务器发登陆命令"cmdLogon"
3.客户收到服务器返回的登陆确认消息后,启动gui窗口。
4.客户关闭gui窗口时,同时向服务器端发送退出命令"cmdExit"客户端主程序:public class SocketManagerClient {
    public static void main(String [] args)throws Exception{
        Socket s = new Socket(InetAddress.getLocalHost(),5000);
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String receiveMessage;
        bw.write("cmdLogon\n");
        bw.flush();
        receiveMessage = br.readLine();
        System.out.println("receive from server:"+receiveMessage);
        
        SocketManagerGui gui = new SocketManagerGui(s);
        gui.setSize(300,300);
        gui.setVisible(true);
    }
}客户端gui程序:public class SocketManagerGui extends JFrame {
    BufferedWriter bw;
    public SocketManagerGui(Socket s) throws Exception{
        bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        this.addWindowListener(new WindowAdapter(){
              public void windowClosing(WindowEvent e){
                  try{
                      String systemCmd = "cmdExit";
                      System.out.println(systemCmd);          
                      bw.write(systemCmd);
                      bw.flush();
                      System.out.println("write socket ok:"+systemCmd);
                  }
                  catch(Exception ex){
                      ex.printStackTrace();
                  }
              }
          });
    }
}
服务器端流程:
1.服务器监听端口,发现请求,创建连接
2.启动一个线程,创建一个用户服务类,把这个类和创建的socket绑定;即:SocketManagerTask(Socket s);启动线程;
3.用户服务类够找一个while(true)时刻监听用户发来的消息,并通过check()函数解析用户消息,执行相应动作。服务器主类:public class SocketManagerServer extends Thread{
    public static void main(String [] args)throws Exception{
        ServerSocket ss = new ServerSocket(5000);
        while (true) {
            Socket s=ss.accept();
            SocketManagerTask task = new SocketManagerTask(s);
            task.run();
        }
    }
}服务器用户服务类:public class SocketManagerTask implements Runnable{
    private BufferedReader br;
    private BufferedWriter bw;
    private String receive;
    private String send;
    private String cmd = null;
    public SocketManagerTask(Socket s) throws Exception{
        try{
            this.br=new BufferedReader(new InputStreamReader(s.getInputStream()));
            this.bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        }
        catch(Exception e){
            System.out.println("create br/bw error.");
        }    }
    public void run(){
        
        while(true){
            try{
              System.out.println("begin to receive cmd from client:");
                cmd = br.readLine();
                System.out.println("receive cmd from client:"+cmd);
                if(cmd==null){
                    continue;
                }
                else{
                    check();
                }
            }
            catch(Exception e){
               System.out.println("receive cmd from client error");
            }        }
    }
    public void check(){
        if(cmd.equals("cmdLogon")){
            System.out.println("client logon ");
            try{
                bw.write("logon\n");
                bw.flush();
            }
            catch(Exception e){
                System.out.println("retrun logon message to client error.");
            }
        }
        if(cmd.equals("cmdExit")){
            System.out.println("client exit");
            try{
                bw.write("exit\n");
                bw.flush();
            }
            catch(Exception e){
                System.out.println("retrun exit message to client error.");
            }
        }
    }
}