各位大哥,大姐,大神们下午好,小弟在此有礼了。
最近在用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();
}
}
}
}socket cpu占率过大 聊天
最近在用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();
}
}
}
}socket cpu占率过大 聊天
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货