⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qqserver.java

📁 JAVA的聊天源代码
💻 JAVA
字号:
package qq;

import java.io.*;
import java.net.*;
import java.util.Hashtable;

public class QQServer implements Runnable {

    //变量声明
    static Hashtable onLineUser = new Hashtable();
    int change = 0;
    Socket s = null;
    ObjectInputStream objIn = null;

    public void run() {
        try {
            DataControl dataControl = new DataControl();
            dataControl.readAllUserInfo();
            ServerSocket ss = new ServerSocket(10000);
            while (true) {
                s = ss.accept();
                objIn = new ObjectInputStream(s.getInputStream());
                try {
                    Object obj = objIn.readObject();
                    if (obj instanceof UserInfo) {
                        UserInfo ui = (UserInfo) obj;
                        if (ui.getInfoType() == 1) { //用户登陆
                            this.login(ui); //执行登陆
                        } else if (ui.getInfoType() == 5) { //返回用户好友列表
                            this.returnUserFriendList(ui);
                        } else if (ui.getInfoType() == 2) { //用户注册
                            this.register(ui);
                        } else if (ui.getInfoType() == 3) { //修改用户个人信息
                            this.updateUserInfo(ui);
                        } else if (ui.getInfoType() == 4) { //用户退出登陆
                            ((UserInfo) onLineUser.get(ui.getUserId())).
                                    setOnLine(false);
                            ((UserInfo) DataControl.userInfo.get(ui.
                                    getUserId())).setOnLine(false);
                            change++;
                        }
                    } else if (obj instanceof String) { // 处理用户好友操作
                        String[] temp = ((String) obj).split(";", 3);
                        int requestId = Integer.parseInt(temp[1]);
                        int friendId = Integer.parseInt(temp[2]);
                        if (temp[0].equals("A")) { //添加好友
                            //判断该用户是否存在
                            if (DataControl.userInfo.containsKey(friendId)) {
                                UserInfo addFriend = new UserInfo();
                                addFriend = (UserInfo) DataControl.userInfo.get(
                                        friendId);
                                addFriend.setInfoType(6);
                                addFriend.setOnLine(true);
                                String userIp = ((UserInfo) onLineUser.get(
                                        requestId)).getUserIp();
                                int userPort = ((UserInfo) onLineUser.get(
                                        requestId)).getUserPort();
                                this.send(userIp, userPort, addFriend);
                                if (onLineUser.containsKey(friendId)) {
                                    addFriend = (UserInfo) onLineUser.get(requestId);
                                    addFriend.setInfoType(6);
                                    addFriend.setOnLine(true);
                                    userIp = ((UserInfo) onLineUser.get(
                                            friendId)).getUserIp();
                                    userPort = ((UserInfo) onLineUser.get(
                                            friendId)).getUserPort();
                                    this.send(userIp, userPort, addFriend);
                                }
                                dataControl.addFriend(requestId, addFriend);
                            } else { //用户不存在返回false
                                UserInfo addFriend = new UserInfo();
                                addFriend.setInfoType(6);
                                addFriend.setOnLine(false);
                                String userIp = ((UserInfo) onLineUser.get(
                                        requestId)).getUserIp();
                                int userPort = ((UserInfo) onLineUser.get(
                                        requestId)).getUserPort();
                                this.send(userIp, userPort, addFriend);
                            }
                        } else if (temp[0].equals("D")) { //删除好友
                            if (DataControl.userInfo.containsKey(friendId)) {
                                Hashtable userFriendList = new Hashtable();
                                userFriendList = dataControl.readUserFriendList(
                                        requestId);
                                if (userFriendList.containsKey(friendId)) { //判断是否为好友
                                    UserInfo deleteFriend = new UserInfo();
                                    deleteFriend = (UserInfo) userFriendList.
                                            get(friendId);
                                    deleteFriend.setInfoType(7);
                                    deleteFriend.setOnLine(true);
                                    String userIp = ((UserInfo) onLineUser.get(
                                            requestId)).getUserIp();
                                    int userPort = ((UserInfo) onLineUser.get(
                                            requestId)).getUserPort();
                                    this.send(userIp, userPort, deleteFriend);
                                    if (onLineUser.containsKey(friendId)) {
                                        deleteFriend = (UserInfo) DataControl.
                                                userInfo.get(requestId);
                                        deleteFriend.setInfoType(7);
                                        deleteFriend.setOnLine(true);
                                        userIp = ((UserInfo) onLineUser.get(
                                                friendId)).getUserIp();
                                        userPort = ((UserInfo) onLineUser.get(
                                                friendId)).getUserPort();
                                        this.send(userIp, userPort,
                                                  deleteFriend);
                                    }
                                    dataControl.deleteFriend(requestId,
                                            deleteFriend);
                                } else { //不是好友返回false
                                    UserInfo deleteFriend = new UserInfo();
                                    deleteFriend.setInfoType(7);
                                    deleteFriend.setOnLine(false);
                                    String userIp = ((UserInfo) onLineUser.get(
                                            requestId)).getUserIp();
                                    int userPort = ((UserInfo) onLineUser.get(
                                            requestId)).getUserPort();
                                    this.send(userIp, userPort, deleteFriend);
                                }
                            } else { //用户不存在返回false
                                UserInfo deleteFriend = new UserInfo();
                                deleteFriend.setInfoType(7);
                                deleteFriend.setOnLine(false);
                                String userIp = ((UserInfo) onLineUser.get(
                                        requestId)).getUserIp();
                                int userPort = ((UserInfo) onLineUser.get(
                                        requestId)).getUserPort();
                                this.send(userIp, userPort, deleteFriend);
                            }
                        }
                    } else if (obj instanceof Message) { //处理聊天信息
                        Message msg = (Message) obj;
                        //判断好友是否在线
                        if (this.onLineUser.containsKey(msg.getToId())) {
                            String userIp = ((UserInfo)this.onLineUser.get(msg.
                                    getToId())).getUserIp();
                            int userPort = ((UserInfo)this.onLineUser.get(msg.
                                    getToId())).getUserPort();
                            System.out.println(msg.toString());
                            this.send(userIp, userPort, msg);
                        } else {
                            //保存聊天信息(待实现)
                            //saveMessage();
                            int temp = msg.getToId();
                            msg.setToId(msg.getFromId());
                            msg.setFromId(temp);
                            msg.setFromName("系统消息");
                            msg.setMessage("好友不在线!");
                            String userIp = ((UserInfo)this.onLineUser.get(msg.
                                    getToId())).getUserIp();
                            int userPort = ((UserInfo)this.onLineUser.get(msg.
                                    getToId())).getUserPort();
                            System.out.println(msg.toString());
                            this.send(userIp, userPort, msg);
                        }
                    }
                } catch (Exception e) {}
                //当用户信息发生变化时保存信息
                if (change != 0) {
                    dataControl.saveAllUserInfo();
                    change = 0;
                }
            }
        } catch (Exception e) {}
    }

    //用户登陆
    private void login(UserInfo userInfo) {
        //判断帐户是否存在
        if (DataControl.userInfo.containsKey(userInfo.getUserId())) {
            //判断密码是否正确
            if (userInfo.getPassWord().equals(((UserInfo) DataControl.
                                               userInfo.get(userInfo.getUserId())).
                                              getPassWord())) {
                ((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
                        setOnLine(true);
                ((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
                        setUserIp(userInfo.getUserIp());
                userInfo.setUserName(((UserInfo) DataControl.userInfo.get(
                        userInfo.getUserId())).getUserName());
                userInfo.setOnLine(true);
                this.send(userInfo.getUserIp(), userInfo.getUserPort(),
                          userInfo);
                this.onLineUser.put(userInfo.getUserId(), userInfo); //将用户添加到在线列表
                change++;
            } else { //密码错误返回false
                userInfo.setOnLine(false);
                this.send(userInfo.getUserIp(), userInfo.getUserPort(),
                          userInfo);
            }
        } else { //帐号不存在返回false
            userInfo.setOnLine(false);
            this.send(userInfo.getUserIp(), userInfo.getUserPort(), userInfo);
        }
    }

    //返回用户好友列表
    private void returnUserFriendList(UserInfo userInfo) {
        Hashtable userFriendList = new Hashtable();
        DataControl dataControl = new DataControl();
        userFriendList = dataControl.readUserFriendList(userInfo.getUserId());
        this.send(userInfo.getUserIp(), userInfo.getUserPort(), userFriendList);
    }

    //用户注册
    private void register(UserInfo userInfo) {
        userInfo.setUserId(DataControl.userInfo.size() + 1);
        DataControl.userInfo.put(userInfo.getUserId(), userInfo);
        this.send(userInfo.getUserIp(), userInfo.getUserPort(), userInfo);
        try {
            File file = new File("Data//" + userInfo.getUserId() + ".dat");
            file.createNewFile();
        } catch (IOException ex) {
        }
        change++;
    }

    //修改用户个人信息
    private void updateUserInfo(UserInfo userInfo) {
        ((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
                setUserName(userInfo.getUserName());
        ((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
                setPassWord(userInfo.getPassWord());
        userInfo.setOnLine(true);
        this.send(userInfo.getUserIp(), userInfo.getUserPort(), userInfo);
        change++;
    }

    //转发信息
    private void send(String userIp, int userPort, Object obj) {
        try {
            Socket socket = new Socket(userIp, userPort);
            ObjectOutputStream objOut = new ObjectOutputStream(socket.
                    getOutputStream());
            objOut.writeObject(obj);
            objOut.flush();
            objOut.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            QQServer qq = new QQServer();
            Thread server = new Thread(qq);
            server.start();
        } catch (Exception e) {}
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -