|
|

楼主 |
发表于 2006-3-24 08:43:44
|
显示全部楼层
我写了个服务器,然后用QQ和服务器进行消息传递,发现运行速度十分慢,尤其是打开QQ的时候
而且一旦开了QQ的线程后,CPU使用率一直是100%,这个是什么问题导致的?我搞不明白,希望帮我看一下。
服务器代码:
/**
* 启动服务器
*/
public void openServer() {
try {
onlineUsers = 0;
InetSocketAddress address = new InetSocketAddress(InetAddress
.getLocalHost(), port);
serverSocket = new ServerSocket();
serverSocket.bind(address);
str = totaljTextArea.getText() + "已经启动服务器!"
+ serverSocket.getInetAddress() + "\n";
totaljTextArea.setText(str);
handlers = new Vector<Object>();
listenForClients(serverSocket);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 监听来自客户端的连接请求
*/
protected void listenForClients(ServerSocket server) {
int clientID = 0;
while (true) {
try {
Socket client = server.accept();
ChatHandler handler = new ChatHandler(++clientID, client);
handler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 每一个用户
*/
public class ChatHandler implements Runnable {
protected ClientInfo clientInfo = new ClientInfo();
// 套接字
protected Socket socket;
// 对象输入流
protected ObjectInputStream in;
// 对象输出流
protected ObjectOutputStream out;
// 指定的用来处理用户的线程
protected Thread listener;
public ChatHandler(int clientID, Socket socket) {
clientInfo.clientId = clientID;
this.socket = socket;
}
/**
* 连接检测 检测客户端发送的登陆消息和密码校验
*/
protected boolean handShake() {
try {
// 读入对象
Object logMsg = in.readObject();
if (logMsg instanceof Message) {
try {
switch (((Message)logMsg).msgType) {
case LOGIN_CHECK:
empNum = ((Message) logMsg).name;
psw = ((Message) logMsg).psw;
if (!checkPsw()) {
Message message = new Message();
message.logIn = false;
message.loginCheckMessage(empNum,"密码校验错误!");
out.writeObject(message);
out.flush();
message.clear();
onlineUsers--;
in.close();
out.close();
return false;
}
// clientList.addElement(empNum);
onlineUsers++;
Message message = new Message();
message.logIn = true;
message.loginCheckMessage(empNum,"登陆成功!");
out.writeObject(message);
out.flush();
message.clear();
break;
default:
break;
}
} catch (Exception e) {
// e.printStackTrace();
}
} else {
System.out.println(logMsg);
}
} catch (Exception e) {
// e.printStackTrace();
}
return true;
}
public synchronized void start() {
if (listener == null) {
try {
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
if (!handShake())
return;
listener = new Thread(this);
listener.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public synchronized void stop() {
if (listener != null) {
if (listener != Thread.currentThread()) {
try {
listener.interrupt();
listener = null;
handlers.removeElement(this);
// clientList.removeElement(clientInfo.clientName);
UpdateList newClient = new UpdateList();
newClient.requestType = false;
newClient.newClient = clientInfo.clientName;
broadcast(newClient);
out.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void run() {
try {
handlers.addElement(this);
while (true) {
try {
Object clientMsg = in.readObject();
if (clientMsg instanceof Message) {
// 是公共信息
if (((Message) clientMsg).audience == true) {
broadcast(clientMsg);
}
// 私有信息
else {
((ChatHandler) (handlers
.elementAt(((Message) clientMsg).recieverId))).out
.writeObject(clientMsg);
}
} else if (clientMsg instanceof ChatRequest) {
((ChatHandler) (handlers
.elementAt(((Message) clientMsg).recieverId))).out
.writeObject(clientMsg);
} else if (clientMsg instanceof LogOut) {
onlineUsers--;
break;
} else {
System.out.println(clientMsg);
}
} catch (Exception e) {
// e.printStackTrace();
}
}
} catch (Exception e) {
// e.printStackTrace();
} finally {
stop();
}
}
/**
* 关闭服务器
*/
protected void shutDown() {
try{
serverSocket.close();
}catch (Exception e) {
}
System.exit(0);
} |
|