Java课程设计——AChat

团队名称、团队成员介绍、任务分配,团队成员课程设计博客链接(以表格形式呈现),标明组长。

团队名称:三点起床敲代码
团队成员介绍:

姓名gitee账号任务分配
王奥运(组长)AAAAysy客户端多线程,css修饰客户端,客户端方法
陈伟盛晚点睡觉GUI界面,点击事件,页面逻辑,客户端方法
张小杰代码小白12客户端与服务端网络通信,处理数据,服务端多线程
胡华早点睡觉数据库应用,数据处理,服务端多线程

本项目的git地址。

客户端:https://gitee.com/aaaaysy/achat-client.git
服务端:https://gitee.com/code-white-12/achat-server.git

项目git提交记录截图(要体现出每个人的提交记录及提交说明)

请添加图片描述

前期调查(主要包含别人做得怎么样、怎么做的内容)

我们将制作一个通信软件,我们参考当下最流行的社交软件微信和QQ,并从中吸取了一些精华。聊天工具最基本功能就是即时通讯,包括对好友私聊和群聊,将通过服务器转发,并存储聊天记录在服务器端的数据库。区分不同的用户,用不同的账号密码进行登录请求,在此之外还要有增删好友和进退群聊的功能,用户信息和好友信息也存放在数据库。

项目功能架构图、主要功能流程图

客户端框架:
在这里插入图片描述

服务端框架

在这里插入图片描述

发送消息
在这里插入图片描述

添加好友:
在这里插入图片描述

删除好友:
添加好友
加入群聊:
在这里插入图片描述

面向对象设计包图、类图。如果类太多,可仅列出主要类。

客户端:
View包:图形界面包
main包:启动程序
utiles包:工具包
messagetype包:消息包
image包:界面资源文件
在这里插入图片描述

服务端:
lib包:资源包
messagetype包:消息包
pojo包:用户
photo包:图片资源
resources包:资源包
在这里插入图片描述

项目运行截图或屏幕录制

登录界面

在这里插入图片描述
密码错误反馈
在这里插入图片描述

注册界面

在这里插入图片描述
头像可以拖拉,也可以填写地址或网络地址
在这里插入图片描述
生日选择框
在这里插入图片描述
注册成功,返回账号
在这里插入图片描述

聊天界面

在这里插入图片描述

群聊界面

在这里插入图片描述

群聊主页

在这里插入图片描述

群成员列表

在这里插入图片描述

邀请好友进群

在这里插入图片描述

好友界面

资料详情

个人资料
在这里插入图片描述
好友资料
在这里插入图片描述

添加新好友

在这里插入图片描述
在这里插入图片描述
几种反馈
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

新的好友请求(别人发来的好友请求)

在这里插入图片描述
在这里插入图片描述

建立新的群聊

在这里插入图片描述
创建成功的反馈
在这里插入图片描述

项目关键代码分模块描述:模块名称-文字说明-关键代码(注意:不得直接复制所有源代码,仅粘贴最关键代码)。

客户端主界面

package view.controller;

/**
 * @author
 */
public class MainWindowController implements Initializable {
    @FXML
    public CheckBox checkBox1;
    @FXML
    public CheckBox checkBox2;
    @FXML
    private ListView<Object> groupChatListView;
    @FXML
    private ListView<Object> groupMessageListView;
    @FXML
    private TextArea groupTestArea;
    @FXML
    private Button groupSendButton;
    @FXML
    public  Label groupName;
    @FXML
    private ListView<Object> friendListView;
    @FXML
    private ListView<Object> friendChatListView;
    @FXML
    private ListView<Object> friendMessageListView;
    @FXML
    private TextField url;
    @FXML
    private ImageView imageView;
    @FXML
    private Button loadImage;
    @FXML
    private Button setHead;
    @FXML
    private Tab headTab;
    @FXML
    private Button sendButton;
    @FXML
    private Label gender;
    @FXML
    private Label diqu;
    @FXML
    private Label gender1;
    @FXML
    private Label beizhu1;
    @FXML
    private ImageView headphoto;
    @FXML
    private Label account1;
    @FXML
    private Label beizhu;
    @FXML
    private Label diqu1;
    @FXML
    private Label account;
    @FXML
    private Label userName1;
    @FXML
    private Label friendName;
    @FXML
    private TabPane tabPane;
    @FXML
    private Tab tab3;
    @FXML
    private Tab tab1;
    @FXML
    private Tab tab2;
    @FXML
    private TextArea testArea;

    public static ObservableList<Object> friendList1;
    public static ObservableList<Object> chatList1;
    public static ObservableList<Object> groupList1;

    public static List<User> friends;
    public static User chooseUser;
    public static ObservableList<Object> chooseFriendMessagePage;
    public static ArrayList<ObservableList<Object>> friendMessagePageList = new ArrayList<>();

    public static List<Group> groups;
    public static Group chooseGroup;
    public static ObservableList<Object> chooseGroupMessagePage;
    public static ArrayList<ObservableList<Object>> groupMessagePageList = new ArrayList<>();

    @SneakyThrows
    @Override
    public void initialize(URL location, ResourceBundle resources) {

        MainWindow.getMainWindow().setFriendListView(friendListView);
        MainWindow.getMainWindow().setGroupName(groupName);
        MainWindow.getMainWindow().setFriendName(friendName);
        MainWindow.getMainWindow().setHeadTab(this.headTab);

        tabPane.setTabMaxHeight(200);
        tabPane.setTabMaxWidth(200);
        tabPane.getSelectionModel().select(tab1);
        ImageView iv = new ImageView("file:photo/" + MainWindow.getMainWindow().getUser().getAccount() + ".png");
        iv.setFitHeight(50);
        iv.setFitWidth(50);
        headTab.setGraphic(iv);
        headTab.setStyle("-fx-background-color: rgb(51,51,51)");
        headTab.setText("  ");
        setTabImage(tab1,"image/mainWindow/vx.png");
        setTabImage(tab2,"image/mainWindow/friend.png");
        setTabImage(tab3,"image/mainWindow/group.png");

        int y=265,x=55;
        tabPane.setOnMouseMoved(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if (event.getSceneY() <= y && event.getSceneX() <= x) {
                    tabPane.setCursor(Cursor.HAND);
                } else {
                    tabPane.setCursor(Cursor.DEFAULT);
                }
            }
        });
        friendListView.setItems(friendList1);
        friendChatListView.setItems(chatList1);
        groupChatListView.setItems(groupList1);
        friendListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            int num = friendListView.getSelectionModel().getSelectedIndex();//获取点击的序号
            User user;
            int bound=4;
            int addNewFriend=1;
            int newFriend=2;
            int createGroup=3;
            if (num < bound) {
                user = MainWindow.getMainWindow().getUser();
            } else {
                user = friends.get(num - 4);
            }
            if (num == addNewFriend) {
                new AddNewFriend();
            }else if (num == newFriend) {
                new NewFriend();
                try {
                    NewFriend.getNewFriend().fun();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else if(num==createGroup){
                new CreateGroup();
            }
            userName1.setText(user.getName());//用户名
            account1.setText(user.getAccount());//账号
            diqu1.setText(user.getAddress());//地址
            gender1.setText(user.getSex());//性别
            beizhu1.setText("无");//备注
            Image p = new Image(String.format("file:photo/%s.png", user.getAccount()));
            headphoto.setImage(p);//头像
        });
        //点击加载消息
        friendChatListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            int num = friendChatListView.getSelectionModel().getSelectedIndex();//获取点击的序号
            chooseUser = friends.get(num);//获取该消息信息
            chooseFriendMessagePage = friendMessagePageList.get(num);
            friendMessageListView.setItems(chooseFriendMessagePage);
            friendMessageListView.scrollTo(chooseFriendMessagePage.size() - 1);
            friendName.setText(chooseUser.getName());
        });
        //点击加载群
        groupChatListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            int num = groupChatListView.getSelectionModel().getSelectedIndex();
            try {
                chooseGroup = groups.get(num);
                chooseGroupMessagePage = groupMessagePageList.get(num);
            }catch (Exception e){

            }
            groupMessageListView.setItems(chooseGroupMessagePage);
            groupMessageListView.scrollTo(chooseGroupMessagePage.size() - 1);
            groupName.setText(chooseGroup.getGroupName());
        });

    }

    public void setTabImage(Tab tab,String url){
        ImageView iv=new ImageView(url);
        iv.setFitHeight(35);
        iv.setFitWidth(35);
        tab.setGraphic(iv);
        tab.setText(" ");

    }

    public void sendMessageToFriend(MouseEvent event) {
        int num = friends.indexOf(chooseUser);
        friendMessageListView.setItems(chooseFriendMessagePage);
        String message = testArea.getText();
        testArea.clear();
        if(checkBox1.isSelected()) {
            message=message.substring(0,message.length()-1);
        }
        chooseFriendMessagePage.add(new MessageBubble().setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
        chooseFriendMessagePage.add(new MessageBubble().setOnRight(message, MainWindow.getMainWindow().getUser().getAccount()));
        if (num > 0) {
            friendList1.add(4,MainWindowController.friendList1.remove(num+4));
            chatList1.add(0, chatList1.remove(num));
            friends.add(0, friends.remove(num));
            friendMessagePageList.add(0, friendMessagePageList.remove(num));
        }
        friendChatListView.getSelectionModel().selectFirst();
        chooseFriendMessagePage = friendMessagePageList.get(0);
        friendMessageListView.scrollTo(chooseFriendMessagePage.size() - 1);
        Connect connect = Connect.getConnect();
        try {
            connect.sendMessageToFriend(MainWindow.getMainWindow().getUser(), chooseUser, message);
            System.out.println("发送消息完成");
        } catch (IOException e) {
            System.out.println("发送消息失败");
        }
    }

    public void sendMessageToGroup(MouseEvent event) {
        int num = groups.indexOf(chooseGroup);
        groupMessageListView.setItems(chooseGroupMessagePage);
        String message = groupTestArea.getText();
        groupTestArea.clear();
        if(checkBox2.isSelected()) {
            message=message.substring(0,message.length()-1);
        }
        chooseGroupMessagePage.add(new MessageBubble().setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
        chooseGroupMessagePage.add(new MessageBubble().setOnRight(message, MainWindow.getMainWindow().getUser().getAccount()));
        if (num > 0) {
            groupList1.add(0, groupList1.remove(num));
            groups.add(0, groups.remove(num));
            groupMessagePageList.add(0, groupMessagePageList.remove(num));
        }
        groupChatListView.getSelectionModel().selectFirst();
        chooseGroupMessagePage = groupMessagePageList.get(0);

        groupMessageListView.scrollTo(chooseGroupMessagePage.size() - 1);

        Connect connect = Connect.getConnect();
        try {
            connect.sendMessageToGroup(MainWindow.getMainWindow().getUser(), chooseGroup, message);
            System.out.println("发送消息完成");
        } catch (IOException e) {
            System.out.println("发送消息失败");
        }
    }
    @FXML
    private void getImage(MouseEvent event) {
        if (url.getText() != null) {
            Image image = new Image(url.getText());
            imageView.setImage(image);
        }
    }
    public void loadImage(DragEvent dragEvent) {
        Dragboard dragboard = dragEvent.getDragboard();
        if (dragboard.hasFiles()) {
            String path = dragboard.getFiles().get(0).getAbsolutePath();
            path = "file:" + path;
            url.setText(path);
            this.getImage(null);
        }
    }
    public void setMouse(DragEvent dragEvent) {
        dragEvent.acceptTransferModes(TransferMode.ANY);
    }
    @FXML
    public void testAreaKeyPressed(KeyEvent keyEvent) {
        if (checkBox1.isSelected() && keyEvent.getCode() == KeyCode.ENTER) {
            this.sendMessageToFriend(null);
        }
    }
    @FXML
    public void groupTestAreaKeyPressed(KeyEvent keyEvent) {
        if (checkBox2.isSelected() && keyEvent.getCode() == KeyCode.ENTER) {
            this.sendMessageToGroup(null);
        }
    }
}

服务端主方法

import MessageType.*;
import com.alibaba.fastjson.JSON;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

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

import org.junit.Test;
import pojo.User;

public class MainFunction {

    private static ArrayList<ServerThread> stList = new ArrayList<ServerThread>();//在线用户集合

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        Socket socket = null;
        try {
            socket = new Socket("192.168.123.169", 9989);
        } catch (IOException e) {
            e.printStackTrace();
        }
        InputStream is = socket.getInputStream();
        OutputStream bs = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(bs);
        DataInputStream dis = new DataInputStream(is);

        byte type2 = 0x01;
        User user=new User("赵洋5d","123456",10,"男","福建","123465",new ArrayList<>());
        String str = JSON.toJSONString(user);
        int len1 = 5 + str.getBytes().length;
        RegMsg rm = new RegMsg(len1, type2, str);
        byte[] data = MsgTool.packMsg(rm);
        dos.write(data);
        dos.flush();

        MSHead msg = MsgTool.readMsgHead(dis);
        byte type1 = msg.getType();
        User user1 = null;
        if (type1 == 0x05) {
            RegResMsg lrm = (RegResMsg) msg;
            user1 = JSON.parseObject(lrm.getJsonStr(), User.class);
            System.out.println("账号:"+user1.getAccount());
            System.out.println("密码:"+user1.getPassword());
            Byte state = lrm.getState();
            if (state == 0) {
                System.out.println("注册成功");
            }
        }

        byte type4 = 0x04;
        String jsonStr = JSON.toJSONString(user1);
        FileMsg fM = new FileMsg(5+jsonStr.getBytes().length,type4,jsonStr);
        byte[] bytes = MsgTool.packMsg(fM);
        dos.write(bytes);
        dos.flush();


        System.out.println("已连接到服务器9999端口,准备传送图片...");
        //获取图片字节流
        FileInputStream fis = new FileInputStream("src\\photo\\t0.jpg");
        //获取输出流
        //OutputStream out = s.getOutputStream();
        BufferedOutputStream bos=new BufferedOutputStream(socket.getOutputStream());
        byte[] buf = new byte[1024];
        int len = 0;
        //2.往输出流里面投放数据
        while ((len = fis.read(buf)) != -1)
        {
            bos.write(buf,0,len);
        }
        bos.flush();
        socket.shutdownOutput();
//        byte type1 = 0x02;
//        User user = new User();
//        user.setAccount("123456");
//        user.setPassword("123456");
//        String jsonStr = JSON.toJSONString(user);
//        LoginMsg lm  = new LoginMsg(5+jsonStr.getBytes().length,type1,jsonStr);
//        byte[] bytes = MsgTool.packMsg(lm);
//        dos.write(bytes);
//        dos.flush();
//        MSHead msg = MsgTool.readMsgHead(dis);
//        byte type1 = msg.getType();
//        if(type1==0x06){
//            LoginResMsg lrm =(LoginResMsg) msg;
//            byte state = lrm.getState();
//            if(state == 0) {
//                System.out.println("登录成功");
//            }
//        }
//        byte type2 = 0x03;
//        String message = "1as65dasd4";
//        ChatMsg cm = new ChatMsg(5+message.getBytes().length,type2,message);
//        byte[] bytes1 = MsgTool.packMsg(cm);
//        dos.write(bytes1);
//        dos.flush();
//        int len;
//        byte[] bytes2 = new byte[1024];
//        while(true){
//            while((len=dis.read(bytes2))!=-1){
//               String message2 = new String(bytes2,0,len);
//                System.out.println(message2);
//            }
//        }


    }//测试方法

    public static boolean checkReg(String name, String account, String password) {
        return true;
    }//注册验证

    public static boolean checkLogin(User user) {
        UserMapper userMapper = loadUserMapperXML();
        List<User> users = userMapper.checkLogin(user.getAccount(), user.getPassword());
        if (!users.isEmpty()) {
            return true;
        } else {
            return false;
        }
    }//登录验证

    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 User saveInformation(User user) {
        UserMapper userMapper = loadUserMapperXML();
//        User user = new User(account,name,password,age,sex,head,address,label,phone,background);
//        int i = userMapper.saveUser(user);
        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;
            int count=0;
            while((len = bis.read(b))!=-1){
                count+=len;
                bos.write(b,0,len);
            }
            bis.close();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void returnImage(Socket s,String account) {
        try {
            System.out.println(account);
            String s1=String.format("src/photo/ %s.jpg",account);
            String s2 ="src/photo/"+account+".jpg";
            System.out.println(s1);
            FileInputStream fis = new FileInputStream(new File("src/photo/123458.jpg" ));
            BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
            byte[] buf = new byte[1024*6];
            int len = -1;
            //2.往输出流里面投放数据
            while ((len = fis.read(buf)) != -1)
            {
                bos.write(buf,0,len);
            }
            bos.flush();
            s.shutdownOutput();

            fis.close();
            //bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test() {
//        UserMapper userMapper = loadUserMapperXML();
//        User user=new User("徐家棚","123456",10,"男","福建","123465",new ArrayList<>());
        String s = userMapper.selectAccount(user.getName());
//        System.out.println(s);
    }
}

客户端和服务端的通信

package utils;

import com.alibaba.fastjson.JSON;
import lombok.Data;
import messagetype.*;

import java.io.*;
import java.net.Socket;

/**
 * @author
 */
@Data
public class Connect {
    private static Connect connect;
    private static final String IP = "106.55.180.124";
    private static final int PORT = 9999;
    private Socket socket = null;
    DataInputStream  dis = null;
    DataOutputStream dos = null;
    BufferedInputStream bis=null;
    BufferedOutputStream bos=null;

    private Connect() throws IOException {
    }


    static {
        try {
            connect = new Connect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Connect getConnect() {
        return connect;
    }

    public  String  register(User user) throws IOException {
        byte type2 = 0x01;
        String str = JSON.toJSONString(user);
        int len1 = 5 + str.getBytes().length;
        RegMsg rm = new RegMsg(len1, type2, str);
        byte[] data = MsgTool.packMsg(rm);
        dos.write(data);
        dos.flush();

        MsHead msg = MsgTool.readMsgHead(dis);
        byte type1 = msg.getType();
        User user1 = null;
        if (type1 == ByteType.REGISTER_RES_MESSAGE) {
            RegResMsg lrm = (RegResMsg) msg;
            user1 = JSON.parseObject(lrm.getJsonStr(), User.class);
            Byte state = lrm.getState();
            if (state == 0) {
                System.out.println("注册成功");
            }
        }
        byte type4 = ByteType.SAVE_IMAGE_MESSAGE;
        String jsonStr = JSON.toJSONString(user1);
        messagetype.FileMsg fM = new messagetype.FileMsg(5+jsonStr.getBytes().length,type4,jsonStr);
        byte[] bytes = MsgTool.packMsg(fM);
        dos.write(bytes);
        dos.flush();
        File file=new File("photo/temp.png");
        FileInputStream fis = new FileInputStream(file);
        //获取输出流
        bos=new BufferedOutputStream(socket.getOutputStream());
        byte[] buf = new byte[1024];
        int len = 0;
        int count=0;
        //2.往输出流里面投放数据
        while ((len = fis.read(buf)) != -1)
        {
            count+=len;
            bos.write(buf,0,len);
        }
        bos.flush();
        socket.shutdownOutput();
        fis.close();
        bos.close();
        dos.close();
        file.delete();
        return user1.getAccount();
    }
    public boolean startConnect() {
        try {
            socket = new Socket(IP, PORT);
            this.dos = new DataOutputStream(socket.getOutputStream());
            this.dis = new DataInputStream(socket.getInputStream());
            System.out.println("连接成功");
            return true;
        } catch (IOException e) {
            System.out.println("连接失败");
            return false;
        }
    }
    public void sendMessageToFriend(User srcUser, User desUser, String message) throws IOException {
        UserMsgToUser um = new UserMsgToUser(srcUser,desUser,message);
        String privateMsg = JSON.toJSONString(um);
        byte type = 0x03;
        ChatMsg cm = new ChatMsg(privateMsg.getBytes().length+5,type,privateMsg);
        byte[] bytes = MsgTool.packMsg(cm);
        dos.write(bytes);
        dos.flush();
    }
    public void sendMessageToGroup (User srcUser,Group desGroup,String message) throws IOException{
        byte type = 0x17;
        String groupAccount = desGroup.getGroupAccount();
        UserMsgToGroup um = new UserMsgToGroup(message,groupAccount,srcUser);
        String information = JSON.toJSONString(um);
        TogetherChatMsg tt = new TogetherChatMsg(5+information.getBytes().length,type,information);
        byte[] bytes = MsgTool.packMsg(tt);
        dos.write(bytes);
        dos.flush();
    }

    public  User login(String account, String password) throws IOException {
        byte type = 0x02;
        User user = new User();
        user.setAccount(account);
        user.setPassword(password);
        String string = JSON.toJSONString(user);
        int len = 5+string.getBytes().length;
        LoginMsg rm = new LoginMsg(len, type, string);
        byte[] data = MsgTool.packMsg(rm);
        dos.write(data);
        dos.flush();

        MsHead msg = MsgTool.readMsgHead(dis);
        byte type1 = msg.getType();
        if (type1 == ByteType.LOGIN_RES_MESSAGE) {
            LoginResMsg rrm = (LoginResMsg) msg;
            Byte state = rrm.getState();
            String userStr = rrm.getJsonStr();
            System.out.println(userStr);
            if (state == 0) {
                return JSON.parseObject(userStr, User.class);
            }
        }
        return null;
    }

    public  void getUserByAccount(String account,int flag) throws IOException {
            //flag=0 or 1;

            byte type = 0x07;
            FindMsg fm = new FindMsg(flag,9+account.getBytes().length, type,account);
            byte[] bytes = MsgTool.packMsg(fm);

            dos.write(bytes);
            dos.flush();
    }
    public   void getNewFriends(String account) throws IOException {

        byte type = 0x10;
        FindResList frl = new FindResList(account.getBytes().length+5,type,account);
        byte[] bytes = MsgTool.packMsg(frl);
        dos.write(bytes);
        dos.flush();
    }

    public  boolean getHeadByAccount(String account) throws IOException {
        File file=new File(String.format("photo/%s.png",account));

        if(file.exists()){
            return false  ;
        }
        byte type = ByteType.FIND_IMAGE_MESSAGE;
        AccountAndImage aai = new AccountAndImage(account,null);
        String accountAndImage = JSON.toJSONString(aai);
        FindImageMsg fim = new FindImageMsg(5+accountAndImage.getBytes().length,type,accountAndImage);
        byte[] bytes = MsgTool.packMsg(fim);
        dos.write(bytes);
        dos.flush();

return true;
    }

    public  void addFriend(User me,User friend) throws IOException {
        UserToUser userToUser=new UserToUser(me,friend);
        byte type = 0x09;
        String json = JSON.toJSONString(userToUser);
        AddFriendMsg afm = new AddFriendMsg(5+json.getBytes().length,type,json);
        byte[] bytes = MsgTool.packMsg(afm);
        dos.write(bytes);
        dos.flush();
    }

    public  void handFriendRequests(User me, User friend, byte state) throws IOException {
        UserToUser userToUser = new UserToUser(me,friend);
        String json = JSON.toJSONString(userToUser);
        byte type = 0x11;
        AddFriendResMsg afrm = new AddFriendResMsg(6+json.getBytes().length,type,state,json);
        byte[] bytes = MsgTool.packMsg(afrm);
        dos.write(bytes);
        dos.flush();
        System.out.println("已同意");
    }

    public void getFriendMessageList(User user) throws IOException {
        byte type = 0x12;
        String jsonUser = JSON.toJSONString(user);
        FriendMsgList fml = new FriendMsgList(5+jsonUser.getBytes().length,type,jsonUser);
         byte[] bytes = MsgTool.packMsg(fml);
         dos.write(bytes);
         dos.flush();
    }

    public void getGroupMessageList(User user) throws IOException {
        byte type = ByteType.GROUP_MESSAGE_LIST;
        String jsonGroupMsg = JSON.toJSONString(user);
        GroupMsgList gm = new GroupMsgList(5+jsonGroupMsg.getBytes().length,type,jsonGroupMsg);
        byte[] bytes = MsgTool.packMsg(gm);
        dos.write(bytes);
        dos.flush();
    }

    public void delete(User srcUser,User desUser) throws IOException {
        byte type = ByteType.DELETE_FRIEND_MESSAGE;
        UserToUser utu=new UserToUser(srcUser,desUser);
        String jsonUser =  JSON.toJSONString(utu);
        DeleteFriendMsg dfm = new DeleteFriendMsg(5+jsonUser.getBytes().length,type,jsonUser);
        byte[] bytes = MsgTool.packMsg(dfm);
        dos.write(bytes);
        dos.flush();
    }

    public void exitGroup(User user, Group group) throws IOException {
        System.out.println(group);
        byte type = ByteType.EXIT_GROUP_MESSAGE;
        ExitGroup eg = new ExitGroup(group,user);
        String json = JSON.toJSONString(eg);
        ExitGroupMsg egm = new ExitGroupMsg(5+json.getBytes().length,type,json);
        byte[] bytes = MsgTool.packMsg(egm);
        dos.write(bytes);
        dos.flush();
    }

    public void createGroup(User user, Group group) throws IOException {
        byte type = ByteType.BUILD_GROUP_MESSAGE;
        String str = null;
        try {
            str = ImgUtil.encodeImage("photo/temp/temp.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
        group.setImage(str);
        String jsonGroup = JSON.toJSONString(group);
        CreateGroupMsg cg = new CreateGroupMsg(5+jsonGroup.getBytes().length,type,jsonGroup);
        byte[] bytes = MsgTool.packMsg(cg);
        dos.write(bytes);
        dos.flush();
    }



    public void disconnect() throws IOException {
        if(bos!=null){
            bos.close();
        }
        if(bis!=null){
            bis.close();
        }
        if(dis!=null){
            dis.close();
        }
        if(dos!=null){
            dos.close();
        }
        socket.close();
    }


    public void userAccessToGroup(User desUser, Group group) throws IOException {
        byte type = ByteType.ADD_USER_TO_GROUP_MESSAGE;

        UserGroupToUser ug = new UserGroupToUser(desUser,group);
        String json = JSON.toJSONString(ug);
        AddUserToGroupMsg aut = new AddUserToGroupMsg(5+json.getBytes().length,type,json);
        byte[] bytes = MsgTool.packMsg(aut);
        dos.write(bytes);
        dos.flush();
    }
}

项目代码扫描结果及改正。

考核前请务必在IDE中使用阿里巴巴代码规范扫描插件对项目代码进行扫描,并解决项目中的所有警告。
负责编写博客的同学请在博客中列出改正前2-3个不同类型的扫描警告结果,并描述改正过程,请放入团队博客3.9。
在这里插入图片描述
1、在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if (condition) statements。
给if加上{}
2、不允许任何魔法值(即未经定义的常量)直接出现在代码中。
用枚举将魔法值定义为常量。
3、Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
翻转equals的调用。
4、方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式。
修改命名规则。
5、单个方法的总行数不超过80行。 说明:除注释之外的方法签名、结束右大括号、方法内代码、空行、回车及任何不可见字符的总行数不超过80行。
将一些功能封装成方法,尽量减少一个方法中的代码行数

项目总结感想

第一次多人合作一个大的项目,前期因为没有正确梳理需求,没有划分好每个人的分工,缺乏沟通交流,在代码实现的过程中遇到了很多问题,甚至不乏争吵客户端和服务端之间传输数据包遇到的问题,文件的存储路径问题,多线程相争问题,jar包封装问题,服务器最终部署到云端问题,不过最后项目也成功运行了。项目完成时间较为仓促,项目中有许多不足,有许多未能完成的功能,期待日后的完善。最后感谢整个小组成员的共同努力,完成了此次课程设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值