各位大哥,大姐,大神们下午好,小弟在此有礼了。
 最近在用socket 做聊天功能遇到了问题,不论是在android端还是服务器端,在进行接收消息的线程CPU占用率过大,我以自己开发的机器做服务器,2个用户登录服务器CPU就到100%,android一个用户登录,cpu占用 35%左右。求大神们给出出主意。下面贴服务器端关键代码:
 主线程:
/**
 *聊天Socket服务 
 *@author jennyfer
 */
public class CharServer  extends Thread{
private ServletContext servletContext;
    private ServerSocket serverSocket;

    public  CharServer(ServerSocket serverSocket,ServletContext servletContext){
     this.servletContext=servletContext;
     //从web.xml中读取端口号
     String port =this.servletContext.getInitParameter("socketPort");
     if(serverSocket==null){
     try {
     //打开端口,服务器启动
this.serverSocket=new ServerSocket(Integer.parseInt(port));
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     }
    }
    public void run(){
     //判断该线程是否中断
     while(!this.isInterrupted()){
     try {
     //接收客户端的请求
Socket s = serverSocket.accept();
    //接收客户端发来的信息
    ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
     //转换成自定义数据对象
    CharMessage charMessage = (CharMessage) ois.readObject();
    if(charMessage.getMessageType().equals(CharType.LOGIN)){
           ServerConClientThread cct=ManageServerConClient.getClientThread(charMessage.getSenderId());
           //如果不为空则中断该线程
           if(cct!=null){
            cct.closeSocket();
            cct.interrupt();
           }
  //单开一个线程,让该线程与该客户端保持连接
  cct=new ServerConClientThread(s);
  cct.start();
  ManageServerConClient.addClientThread(charMessage.getSenderId(), cct);
  System.out.println("============"+charMessage.getSenderId()+"账户登录================");
}else if(charMessage.getMessageType().equals(CharType.LOGOUT)){
      ServerConClientThread cct =ManageServerConClient.getClientThread(charMessage.getSenderId());
      cct.closeSocket();
      cct.interrupt();
  ManageServerConClient.removeClientThread(charMessage.getSenderId());
          System.out.println("==========="+charMessage.getSenderId()+"账户退出================");      
}
    
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     }
    }
    
    /**关闭ServerSocket*/
    public void closeSocket(){
     if(serverSocket!=null&&!serverSocket.isClosed()){
     try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     }
    }

}
发送消息线程:
/**
 *服务器和客户端通信线程 
 *@author jennyfer
 */
public class ServerConClientThread extends Thread{
      public Socket s;
      public ServerConClientThread(Socket s){
       this.s=s;
      }
      
      public void run(){
       
        while(!this.isInterrupted()&&!this.s.isClosed()){
          ObjectInputStream ois = null;
          try{
       InputStream in = s.getInputStream();
       if(in.available()>0){
       ois = new ObjectInputStream(in);
       CharMessage charMessage= (CharMessage) ois.readObject();
           //发送图片
           if(charMessage.getMessageType().equals(CharType.IMAGE)){
           System.out.println("=====发送图片=======");
           SendMessage.sendImage(charMessage);
           }
           //发送音频
           else if(charMessage.getMessageType().equals(CharType.VOICE)){
           System.out.println("=====发送音频=======");
           SendMessage.sendVoice(charMessage);
           }
           //发送字符
           else if(charMessage.getMessageType().equals(CharType.CHAR)){
           System.out.println("=====发送字符=======");
           SendMessage.sendChar(charMessage);
           }
       }
      
        } catch (Exception e){
    closeSocket();
e.printStackTrace();
   }
       }
      }
      
      /**关闭Socket*/
      public void closeSocket(){
       if(s!=null&&!s.isClosed()){
       try {
   s.close();
   } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }
       }
      }
   }