Achat ——— 基于多线程与网络通讯的聊天室


Achat - 基于多线程与网络通讯的聊天室

1.主要负责功能

1.用户私聊功能

使用了多线程以及网络通讯技术。服务端通过监听客户端,对客户端发来的信息进行转发等操作。

2.数据库读写编码部分

使用Mybatis框架技术实现了java与数据库之间的连接。与JDBC相比,减少了%50以上的代码量。同时更加灵活,直接编写动态SQL语句。

3.数据库设计

采用MySQL数据库。表设计符合第三范式。

2.负责功能详解

1.用户私聊功能

私聊功能需要实现客户端与服务端的连接,客户端需要发送说的话并由服务端进行转发。同时判断用户是否在线,在线即直接转发,然后存储到数据库中,不在线则直接保存数据库中,等待用户登录时加载。

点击查看代码
public void privateChat(ChatMsg cm) throws IOException {   //客户端之间通过账号进行私聊
        UserMsgToUser um = JSON.parseObject(cm.getPrivateMsg(), UserMsgToUser.class);
        System.out.println(um.getDestUser().getAccount());
        if (sockets.containsKey(um.getDestUser().getAccount())) {
            Socket socket1 = sockets.get(um.getDestUser().getAccount());
            DataOutputStream dou1;
            try {

                dou1 = new DataOutputStream(socket1.getOutputStream());

                byte[] bytes = MsgTool.packMsg(cm);
                dou1.write(bytes);
                dou1.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = date.format(new Date());
        MainFunction.saveMessage(um.getSrcUser().getAccount(), um.getDestUser().getAccount(), um.getMessage(), format);
    }

2.数据库读写编码部分

通过Mybatis框架,编写对应的XML文件,通过接口编写方法。然后在MainFuction类中调用接口中的方法,进行数据库数据的读写。

点击查看代码


    public static User saveInformation(User user) {
        UserMapper userMapper = loadUserMapperXml();
        userMapper.saveUser(user);
        return user;
    }

    public static void updateUser() {
        UserMapper userMapper = loadUserMapperXml();

    }
    //更新用户信息

    public static void deleteUser() {

    }
    //踢出(删除)用户

    public static void parseImage(Socket s, User user) {
        try {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src\\photo\\" + user.getAccount() + ".jpg"));
            BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
            byte[] b = new byte[2048];
            int len = -1;
            while ((len = bis.read(b)) != -1) {
                bos.write(b, 0, len);
            }
            bis.close();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String returnImage(String account) throws IOException {
        String str = ImgUtil.encodeImage("src\\photo\\" + account + ".jpg");
        return str;
    }


    public static List newFriendsMessage(String account) {
        NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
        UserMapper userMapper = loadUserMapperXml();
        List selectmessage = newFriendsMapper.selectmessage(account);
        List users = new ArrayList<>();
        for (String s : selectmessage) {
            User user = userMapper.selevtUserbyAccount(s);
            users.add(user);
        }
        return users;
    }

    public static void addNewFriend(String mAccount, String yAccount) {
        NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
        int i = newFriendsMapper.addFriend(mAccount, yAccount);
        System.out.println(i);
    }

    public static void deleteMessage(String mAccount, String yAccount) {
        NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
        newFriendsMapper.delectAckMessage(mAccount, yAccount);
    }

    public static void addFriend(String mAccount, String yAccount) {
        CompanionMapper companionMapper = loadCompanionMapperXml();
        companionMapper.saveFrined(mAccount, yAccount);
    }

    public static void saveMessage(String aAccount, String bAccount, String message, String data) {
        ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
        chatMessageMapper.saveMessage(aAccount, bAccount, message, data);
    }

    public static ArrayList getMessage(String aAccount, String bAccount) {
        ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
        ArrayList messages = chatMessageMapper.getMessage(aAccount, bAccount);
        return messages;
    }

    public static ArrayList getAllMessage(String account) {
        ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
        ArrayList accountMessages = chatMessageMapper.getAllMessage(account);
        return accountMessages;
    }

    public static void deleteFriend(String account) {
        CompanionMapper companionMapper = loadCompanionMapperXml();
        ChatMessageMapper chatMessageMapper = loadChatMessageMapper();
        chatMessageMapper.deleteMessage(account);
        companionMapper.deleteFriend(account);
    }

    public static ArrayList getMembers(String groupAccount) {
        GroupMapper groupMapper = loadGroupMapper();
        ArrayList members = groupMapper.getMembers(groupAccount);
        return members;
    }

    public static ArrayList getGroups(String account) {
        GroupMapper groupMapper = loadGroupMapper();
        ArrayList gs = groupMapper.getGroups(account);
        ArrayList groups = new ArrayList<>();
        for (Integer i : gs) {
            groups.add(i+"");
        }
        return groups;
    }
    public static String bulidGroup(String groupName ,String hostAccount){
        GroupMapper groupMapper = loadGroupMapper();
        Random random = new Random();
        int number = random.nextInt(900000)+100000;
        String groupAccount = groupNameBefore+number;
        groupMapper.bulidGroup(groupAccount,groupName,hostAccount,hostAccount);

        return groupAccount;
    }

    public static ArrayList writeGroups(User user){
        GroupMapper groupMapper = loadGroupMapper();
        UserMapper userMapper = loadUserMapperXml();
        ArrayList groups = getGroups(user.getAccount());
        ArrayList groups1  = new ArrayList<>();
        for(String s :groups){
            Group g = new Group();
            g.setGroupAccount(s);
            g.setGroupName(groupMapper.getGroupName(s).get(0));
            ArrayList members = groupMapper.getMembers(s);
            ArrayList users = new ArrayList<>();
            for(String str : members){
                User user2 = userMapper.selevtUserbyAccount(str);
                users.add(user2);
            }
            g.setMembers(users);
            g.setHostAccount(groupMapper.getHostAccount(s).get(0));
            groups1.add(g);
        }
        return groups1;
    }
    public static void saveGroupMessage(String account,String groupAccount,String message,String date){
        GroupMessageMapper groupMessageMapper = loadGroupMessageMapper();
        groupMessageMapper.saveMessage(account,groupAccount,message,date);
    }
    public static ArrayList getGroupAccount(String account){
        GroupMapper groupMapper = loadGroupMapper();
        ArrayList groupAccounts = groupMapper.getGroupAccounts(account);
        return groupAccounts;
    }
    public static ArrayList getGroupMessage(String account){
        ArrayList groupAccount = getGroupAccount(account);
        GroupMessageMapper groupMessageMapper = loadGroupMessageMapper();
        ArrayList messages = new ArrayList<>();
        for(String s : groupAccount){
            messages.addAll(groupMessageMapper.getMessage(s));
        }
        return messages;
    }
    public static void saveGroup(String groupAccount,String memberaccount) {
        GroupMapper groupMapper = loadGroupMapper();
        ArrayList groupNames = groupMapper.getGroupName(groupAccount);
        ArrayList hostAccount = groupMapper.getHostAccount(groupAccount);
        if (groupNames == null || hostAccount == null) {

        } else {
            groupMapper.agreeAply(groupAccount, groupNames.get(0), hostAccount.get(0), memberaccount);
        }
    }

    public static void hostExit(String hostAccount){
        GroupMapper groupMapper = loadGroupMapper();
        GroupMessageMapper groupMessageMapper = loadGroupMessageMapper();
        groupMapper.hostExit(hostAccount);
        groupMessageMapper.getMessage(hostAccount);
    }

    public static void memberExit(String memberAccount){
        GroupMapper groupMapper = loadGroupMapper();
        groupMapper.memeberExit(memberAccount);
    }

    public static boolean judgeExist(String senderAccount,String receiverAccount){
        NewFriendsMapper newFriendsMapper = loadNewFriendsMapper();
        String select = newFriendsMapper.select(senderAccount, receiverAccount);
        if(select==null)
        {
            return false;
        }
        else {
            return true;
        }
    }

3.数据库设计

数据库中一共有6个表,包括user(成员)、group(群)、companion(好友)、newfriends(新好友请求)、groupmessage(群聊天记录)、chatmessage(聊天).

点击查看代码
 public static UserMapper loadUserMapperXml() {
        String resource = "resources/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //设置事务自动提交
        UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
        return usermapper;
    }

    public static CompanionMapper loadCompanionMapperXml() {
        String resource = "resources/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //设置事务自动提交
        CompanionMapper companionMapper = sqlSession.getMapper(CompanionMapper.class);
        return companionMapper;
    }

    public static ChatMessageMapper loadChatMessageMapper() {
        String resource = "resources/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //设置事务自动提交
        ChatMessageMapper chatMessageMapper = sqlSession.getMapper(ChatMessageMapper.class);
        return chatMessageMapper;
    }

    public static NewFriendsMapper loadNewFriendsMapper() {
        String resource = "resources/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //设置事务自动提交
        NewFriendsMapper newFriendsMapper = sqlSession.getMapper(NewFriendsMapper.class);
        return newFriendsMapper;
    }

    public static GroupMessageMapper loadGroupMessageMapper() {
        String resource = "resources/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //设置事务自动提交
        GroupMessageMapper groupMessageMapper = sqlSession.getMapper(GroupMessageMapper.class);
        return groupMessageMapper;
    }

    public static GroupMapper loadGroupMapper() {
        String resource = "resources/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //设置事务自动提交
        GroupMapper groupMapper = sqlSession.getMapper(GroupMapper.class);
        return groupMapper;
    }

3.课程设计感想

在建立Java与数据库的连接中,由于有些方法的参数是多个,在编写MySQL语句时的参数判断就十分重要,而Java提供注释@Pram修饰参数,这样就可以实现参数判断。

4.展望

数据库中一些动态SQL语句的实现,以及表的创建还应该进一步的细化。比如在创建user表和chatmessage表中,我在创建时是通过创建两个表来实现的,但是这两个表是毫无关联。而在创建表的时候是可以关联这两个表,通过内联表的方式进行连接。

相关