LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: lipu1022

求教

[复制链接]
 楼主| 发表于 2006-3-24 08:48:48 | 显示全部楼层

客户端代码

/**
         * 登陆
         */
        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();
                }
        }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-24 15:57:22 | 显示全部楼层
问题解决了。。。
/**
* 监听来自客户端的连接请求
*/
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); // 每次发完消息也给她睡一会。。。-_-!!!

郁闷,程序越睡速度越快,有精神可。。。。
回复 支持 反对

使用道具 举报

发表于 2006-3-25 20:37:35 | 显示全部楼层
看到这个帖子,我很高兴,我最近也在研究lumaQQ,欢迎和大家一起交流,我建了个群,欢迎大家加入~~
群号:4104328
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-27 14:51:02 | 显示全部楼层
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();
}
}
}
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-27 15:53:50 | 显示全部楼层
public void stop() {
                        try {
                                listener.interrupt();
                                listener = null;
                                handlers.removeElement(this);
                                out.close();
                                socket.close();
                        } catch (Exception e) {
                        }
                }
我想要实现的是客户端关闭的时候,给服务器发送一条退出消息,然后由run()解析执行后,引用stop()方法,由stop()来关闭该客户端的线程。
public void run() {
Object clientMsg = in.readObject();
                                                if (clientMsg instanceof Message) {
                                                        switch (((Message) clientMsg).msgType) {                                        case LOGOUT:                                                        stop();                                                        break;
........
}
不做任何判断,然后关闭这个线程,可是似乎还是没有关闭掉?CPU的使用率一直是100%
请问该如何解决呢?又或者是别的原因引起的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-27 17:36:07 | 显示全部楼层
public void run() {
Object clientMsg = in.readObject();
if (clientMsg instanceof Message) {
switch (((Message) clientMsg).msgType) {
case LOGOUT:
listener.interrupt();//关闭线程
listener = null;
handlers.removeElement(this);
clientHashMap.get(((Message) clientMsg).name).close();//关闭客户socket
break;
}
我这么写了,还是不行啊,client程序已经退出了,然后服务器端程序还在不停的占用cpu,
搞得cpu一直是100%,我也不知道为什么会这样,分析不出来了 :(  Help!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表