服务器代码:
/**
* 启动服务器
*/
public void openServer() {
try {
onlineUsers = 0;
InetSocketAddress address = new InetSocketAddress(InetAddress
.getLocalHost(), port);
serverSocket = new ServerSocket();
serverSocket.bind(address);
str = "已经启动服务器!" + serverSocket.getInetAddress() + "\n";
System.out.println(str);
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);
}

解决方案 »

  1.   

    客户端代码 
    /**
    * 登陆
    */
    public boolean login() {
    if (user != null && !logging && user.getServerIp() != null) {
    try {
    if (clientSocket == null) {
    logging = true;
    clientSocket = new Socket(user.getServerIp(), user
    .getServerPort());
    if (clientSocket.isConnected()) {
    in = new ObjectInputStream((clientSocket
    .getInputStream()));
    out = new ObjectOutputStream(clientSocket
    .getOutputStream());
    startInputListener();
    // 向服务器发送一条登陆验证消息
    Message message = new Message();
    message.loginCheckMessage(user.getEmpNum(), user
    .getEmpPsw());
    out.writeObject(message);
    out.flush();
    message.clear();
    resInputListener();// 读取服务器的返回验证信息
    startInputListener();
    Object serverMsg = in.readObject();
    resInputListener();
    if (serverMsg instanceof Message) {
    switch (((Message) serverMsg).msgType) {
    case LOGIN_CHECK:
    if (!((Message) serverMsg).logIn) {
    String str = "用户"+((Message) serverMsg).name
    + ":" + ((Message) serverMsg).psw;
    Shell info = new Shell(new Display());
    info.setLocation(200,150);
    MessageDialog.openError(info,"错误!",str);
    user.setLoggedIn(false);
    logout();
    }else{
    String str = "用户"+((Message) serverMsg).name
    + ":" + ((Message) serverMsg).psw;
    System.out.println(str);
    user.setLoggedIn(true);
    logging = false;
    }
    break;
    default:
    break;
    }
    } else
    System.out.println((Message) serverMsg);
    }
    }
    } catch (UnknownHostException e) {
    log.error("未知的服务器地址");
    } catch (UnresolvedAddressException e) {
    log.error("无法解析服务器地址");
    } catch (IOException e) {
    log.error("连接失败");
    }catch(Exception e){}
    }
    return user.isLoggedIn();
    }/**
    * 发送普通消息方法
    */
    public void sendSingleMessage(String empNum, String msg) {
    Message message = new Message();
    message.msgType = MessageType.COMMON;
    }public void startInputListener(){
    listener = new InputListener();
    listener.running = true;
    if (!listener.isAlive())
    listener.start();
    }public void resInputListener(){
    listener.running = false;
    listener.interrupt();// 这里,是应该断开还是wait呢?我都试了,好象效果一样
    listener = null;
    }class InputListener extends Thread {
    boolean running = false;public void run() {
    while (true) {
    if (running) {
    try {
    Object serverMsg = in.readObject();
    if (serverMsg instanceof Message) {
    switch (((Message) serverMsg).msgType) {
    default:
    break;
    }
    } else
    System.out.println((Message) serverMsg);
    } catch (Exception e) {
    }
    }
    }
    }
    }/**
    * 退出

    * @param reason
    * true 服务器断开连接 false 用户断开连接
    */
    public void logout() {
    try {
    user.setLoggedIn(false);
    logging = false;
    out.close();
    in.close();
    clientSocket.close();
    // System.exit(0);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
      

  2.   

    /**
    * 监听来自客户端的连接请求
    */
    protected void listenForClients(ServerSocket server) {
    int clientID = 0;
    while (true) {
    try {
    Socket client = server.accept();
    ChatHandler handler = new ChatHandler(++clientID, client);
    handler.start();
    sleep(100); //这样可以不?
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  3.   

    问题解决了
    /**
    * 监听来自客户端的连接请求
    */
    protected void listenForClients(ServerSocket server) {
    int clientID = 0;
    while (true) {
    try {
    Socket client = server.accept();
    ChatHandler handler = new ChatHandler(++clientID, client);
    handler.start();
    Thread.sleep(1000); // 这里要睡一会-_-!!!
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }public void resInputListener(){
    listener.running = false;
    listener.wait();// 这里还是wait比较好
    listener = null;
    }// 向服务器发送一条登陆验证消息
    Message message = new Message();
    message.loginCheckMessage(user.getEmpNum(), user
    .getEmpPsw());
    out.writeObject(message);
    out.flush();
    message.clear();
    resInputListener();
    Thread.sleep(3000); // 每次发完消息也给她睡一会-_-!!!郁闷,程序越睡速度越快,有精神可。谢谢蚊子