• 【Java小项目】山寨QQ


      最近看着韩顺平老师的视频加上百度谷歌做了这个小玩意。


      主要功能:

               服务器端:

                          1.选择监听端口

                          2.打印服务器日志

                          3.查看在线用户(强制下线没做)

               客户端:

                          1.登陆的密码我写死到程序里了(密码是一个空格)

                          2.三个分组可切换

                          3.可多对多聊天

                          4.A找B好友聊天时,若B好友没有打开与A聊天的界面,则B与A聊天的界面会直接弹出

                          5.可以选择要链接的服务器的地址和端口

                          6.上线,下线好友头像会有相应变化


        思路:

                服务器和客户端用ObjectOutputStream,ObjectInputStream 进行通信,把数据包封装到类里(User,Message)。

                服务器端:

                         1.点击启动服务器时启动一个线程来监听端口

    public void run(){
            try {
                while(true) {
                    Socket s = ss.accept();
                    ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
                    User u = (User) ois.readObject();
                    System.out.println("收到UserName:" + u.getUserName() + " PassWard:" + u.getPassWard());
                    Message m = new Message();
                    ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                    if (u.getPassWard().equals(" ")) {
                        display.di.showLog("用户名:"+u.getUserName() + " 登陆成功!密码:" + u.getPassWard());
                        m.setType("success");
                        oos.writeObject(m);
                        //启动一个线程来服务
                        myThread mythread=new myThread(s,oos,ois);
                        mythread.start();
                        threadManger.addThread(u.getUserName(),mythread);
                        threadManger.friendAlert();
                    } else {
                        display.di.showLog("用户名:"+u.getUserName() + " 登陆失败!密码:" + u.getPassWard());
                        m.setType("failed");
                        oos.writeObject(m);
                        oos.close();
                    }
                }
            }catch(IOException e){
                e.printStackTrace();
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

                      2.监听到登陆,如果登陆成功就在启动一个线程来维持与该Socket的通信

    public void run(){
    
            try {
                while(true) {
                    Message m = (Message)ois.readObject();
                    if(m.getType().equals("sendMsg")) {
                        System.out.println(s + m.getSender() + " 对 " + m.getGetter() + " 说:" + m.getMsg());
                        display.di.showLog(s.getInetAddress()+" : "+m.getSender() + " 对 " + m.getGetter() + " 说:" + m.getMsg());
                        //转发
                        myThread fri = threadManger.getThread(m.getGetter());
                        fri.oos.writeObject(m);
                    }else if(m.getType().equals("LoginOut")){
                        display.di.showLog(m.getSender()+"下线!");
                        threadManger.delThread(m.getSender());
                        threadManger.friendAlert();
                        System.out.println(m.getSender()+" loginOut!");
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
             客户端:

                       1.用填写的信息登陆,若成功的话就启动一个线程来负责该客户端与服务器端之间的通信。

     public void run(){
            try {
                while(true) {
                    Message m = (Message)clientUser.getOIS().readObject();
                    if(m.getType().equals("sendMsg")) {
                        System.out.println(m.getSender() + " say to " + m.getGetter() + " with " + m.getMsg());
                        //已经打开聊天界面
                        if(chatManger.Getchat(m.getGetter() + "_" + m.getSender())!=null) {
                            chat ch = chatManger.Getchat(m.getGetter() + "_" + m.getSender());
                            ch.ShowMsg(m.getSender() + " : " + m.getMsg());
                        }else{
                            chat ch=new chat(m.getGetter(),m.getSender());
                            chatManger.Addchat(m.getGetter()+"_"+m.getSender(),ch);
                            ch.ShowMsg(m.getSender() + " : " + m.getMsg());
                        }
    
                    }else if(m.getType().equals("getFriend")){
                        //好友列表
                        Object[] l=m.getFriList();
                        System.out.println(m.getType()+"  "+l.length);
                        listManger.getMainL().changeList(l);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

      完整代码:

    CSDN下载上传了但是刷不出来啊

    GitHub地址:https://github.com/zhang-tiancheng/qq-little_copycat




  • 相关阅读:
    LinUI学习1 框架的引入
    LinUI学习2 config配置文件配置和使用
    LinUI学习3 Http请求封装与使用
    【网络编程】学习笔记02 套接字类型与协议设置
    【系统编程】 守护进程
    【网络编程】学习笔记03 地址族与数据序列
    【网络编程】学习笔记01 套接字与文件操作
    【系统编程】 进程间通信方式
    【网络编程】学习笔记06 I/O多路复用之epoll
    【网络编程】学习笔记04 server端和client代码
  • 原文地址:https://www.cnblogs.com/A-yes/p/9894224.html
Copyright © 2020-2023  润新知