我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java模拟qq软件的详细过程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java模拟qq软件的详细过程

**之前在封装代码后出现了问题,按照最初的写法,在登陆完毕后弹出聊天界面后会卡死,原因是当时登陆界面和聊天界面都是使用的主线程,我的代码没有写其他线程,无法多线程运行,因此在弹出聊天界面时线程不够用了,就卡在了监听线程里,因为在监听线程中再有新的监听就会被卡住
在宇哥的指点下,将启动服务器和客户端的部分改为线程,就解决了此问题。改善后的代码简练和清晰了很多,更方便大家参考,代码如下:
**

登陆界面的实现

登陆界面主要使用了JFrame,以及相关的一些组件,并且在界面中加上监听
登陆界面效果图

在这里插入图片描述

登陆界面代码Login类


package com.lding.net;

import javax.swing.*;
import java.awt.*;


public class Login{
    JTextField jTextField;


    public static void main(String[] args){
        Login login = new Login ();
        login.showUI ("kk");
    }

    public void showUI(String str){
        JFrame jf = new JFrame ();
        jf.setTitle ("❤️DDqq登陆界面❤️");
        jf.setSize (500, 400);
        jf.setDefaultCloseOperation (3);
        jf.setLocationRelativeTo (null);
        jf.setResizable (false);
        FlowLayout fl = new FlowLayout (FlowLayout.CENTER, 5, 5);
        jf.setLayout (fl);
        Dimension dim1 = new Dimension (500, 200);//图片大小
        Dimension dim2 = new Dimension (100, 50);//标签大小
        Dimension dim3 = new Dimension (300, 30);//输入框大小
        Dimension dim4 = new Dimension (100, 40);//按钮大小

        ImageIcon icon = new ImageIcon ("source/Login1.jpg");
        JLabel labimg = new JLabel (icon);
        labimg.setPreferredSize (dim1);
        jf.add (labimg);

        JLabel labuser = new JLabel ();
        labuser.setText ("user:");
        labuser.setPreferredSize (dim2);
        jf.add (labuser);
        JTextField textuser = new JTextField ();
        textuser.setPreferredSize (dim3);
        jf.add (textuser);

        JLabel labpassword = new JLabel ();
        labpassword.setText ("password:");
        labpassword.setPreferredSize (dim2);
        jf.add (labpassword);

        JPasswordField textPassword = new JPasswordField ();
        textPassword.setPreferredSize (dim3);
        jf.add (textPassword);

        JButton button = new JButton ();
        button.setBorder (BorderFactory.createRaisedBevelBorder ());
        button.setText ("login");
        button.setPreferredSize (dim4);
        jf.add (button);
        jf.setVisible (true);

        LoginListener ll = new LoginListener(textuser,textPassword, jf);
        button.addActionListener (ll);
        this.jTextField=ll.jTextField;

    }
}


login的监听类 LoginListener


package com.lding.net;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class LoginListener implements ActionListener {
    JTextField jTextField;
    JPasswordField jPasswordField;
    JFrame jf ;
    LoginListener( JTextField jTextField,JPasswordField jPasswordField,JFrame jf){
        this.jf=jf;
        this.jTextField = jTextField;
        this.jPasswordField = jPasswordField;
    }
    @Override
    public void actionPerformed(ActionEvent e){
        if(jTextField.getText().equals("Alice")&&String.valueOf(jPasswordField.getPassword()).equals("1234")){
            System.out.println ("服务端登录!!");
            String name =jTextField.getText();
            new Server(name).start();
            jf.dispose();

        }else if(jTextField.getText().equals("Lding")&&String.valueOf(jPasswordField.getPassword()).equals("1234")){

            String name =jTextField.getText();
            System.out.println ("客户端登录!!");
            new Client(name).start();
            jf.dispose();
        }


    }
}

在登陆完毕后,需要跳转到聊天界面,这里采用的方法是通过一个flag标志来判断是否登陆完毕,当登陆完毕后,会创建新的聊天界面,并且登陆页面会被关闭
依然是双端通信,假定一端为客户端,一端为服务端,其实两端都可为用户。

聊天界面运行图

先登陆Alice的账号 密码为123456

在这里插入图片描述

登陆成功后显示ok,并等待连接

在这里插入图片描述

再登陆冷丁的账号,密码为123456

在这里插入图片描述

当lding账号登陆成功后完成连接,这时候会弹出两个新的JFram窗口,为聊天见面

在这里插入图片描述

随后可以发送消息,消息可以实时显示时间,并显示用户名
一方发送的消息会在另一方的窗口上实时显示出来

在这里插入图片描述

Client类代码


package com.lding.net;

import com.lding.ui.MsgUI;

import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Client extends  Thread{
    String name;

    public Client(String name) {
        this.name=name;
    }
    public static void main(String[] args) {
        String port="客户端";
        Login login=new Login();
        login.showUI(port);
    }

    @Override
    public void run(){
        try {
            startClient();
        } catch (IOException e) {
            e.printStackTrace ();
        }
    }

    void startClient() throws IOException{
        Socket socket=new Socket("127.0.0.1",8888);
        //输入 输出流对象
        InputStream inputStream=socket.getInputStream();
        OutputStream outputStream=socket.getOutputStream();
        MsgUI msgUI=new MsgUI(outputStream,name);
        JTextPane showmsgpane=msgUI.initUI("客户端");
        outputStream.flush();
        int count=1;
        while(true){
            int msglenth=inputStream.read();
            System.out.println("消息长度:"+msglenth);
            byte[] msgbytes=new byte[msglenth];
            //将接下来的数据读入字节数组中
            inputStream.read(msgbytes);

            count++;
            if(count%2==0){
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
                String date = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+date+"  ["+getmsg+"]"+"说:"+"\n");
            }else{
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+getmsg+"\n");
            }
        }
    }
}


Server代码


package com.lding.net;

import com.lding.ui.MsgUI;

import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Server extends  Thread{
    JTextField jTextField;
    String name;
    public Server(String name){
        this.name=name;
    }
    public static void main(String[] args) {
        String port="服务端";
        Login login=new Login();
        login.showUI(port);
    }
    @Override
    public void run(){
        try {
            startServer();
        } catch (IOException e) {
            e.printStackTrace ();
        }
    }
    void startServer() throws IOException{
        ServerSocket serverSocket=new ServerSocket(8888);
        System.out.println("等待连接!!");
        Socket clientsocket=serverSocket.accept();//监听连接
        System.out.println("连接成功!!");
        InputStream inputStream=clientsocket.getInputStream();
        OutputStream outputStream=clientsocket.getOutputStream();

        MsgUI msgUI=new MsgUI(outputStream,name);
        JTextPane showmsgpane=msgUI.initUI("服务端");
        //outputStream.flush();
        int count=1;
        while(true){
            int msglenth=inputStream.read();
            System.out.println("消息长度是:"+msglenth);
            byte[] msgbytes=new byte[msglenth];
            //将接下来的数据读入字节数组中
            inputStream.read(msgbytes);
            count++;
            if(count%2==0){
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
                String date = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+date+"  ["+getmsg+"]"+"说:"+"\n");
            }else{
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+getmsg+"\n");
            }
        }
    }
}


登陆界面代码

MsgUI


package com.lding.ui;

import javax.swing.*;
import java.awt.*;
import java.io.OutputStream;


public class MsgUI extends JFrame {

    OutputStream outputStream;
    String name;
    public MsgUI(OutputStream outputStream,String name){
        this.outputStream=outputStream;
        this.name=name;
    }
    public JTextPane initUI(String title){
        setTitle(title);
        setSize(800,800);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(new FlowLayout());
        //接收显示框
        JTextPane jtp=new JTextPane();
        jtp.setPreferredSize(new Dimension(750,400));
        JScrollPane jsp=new JScrollPane(jtp);
        jtp.getText();
        Dimension dim=new Dimension(750,400);//按钮大小



        //发送框
        JTextPane jtp1=new JTextPane();
        jtp1.setPreferredSize(new Dimension(750,200));
        JScrollPane jsp1=new JScrollPane(jtp1);

        JButton btn=new JButton("发送");
        add(jsp);
        add(jsp1);
        add(btn);
        setVisible(true);

        MsgListener msgl=new MsgListener(jtp1,this.outputStream,name);
        btn.addActionListener(msgl);
        return jtp;
    }
}

MsgUIListener


package com.lding.ui;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;


public class MsgListener implements ActionListener {

    JTextPane jtp;
    OutputStream outputStream;
    String name;
    public  MsgListener(JTextPane jtp,OutputStream outputStream,String name){
        this.jtp=jtp;
        this.outputStream=outputStream;
        this.name=name;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        byte[] names=this.name.getBytes();
        try {
            outputStream.write(names.length);
            outputStream.write(names);
            outputStream.flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        }


        String msg=jtp.getText();
        byte[] msgs=msg.getBytes();
        try {
            outputStream.write(msgs.length);
            outputStream.write(msgs);
            outputStream.flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        jtp.setText(null);
    }
}


之后会丰富更多功能 敬请期待! 感谢您的观看!!!

到此这篇关于Java模拟qq软件的详细过程的文章就介绍到这了,更多相关Java 模拟 qq内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java模拟qq软件的详细过程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java软件安装教程详细

以下是Java软件安装的详细教程:1. 下载Java软件安装包首先,你需要从官方网站下载Java软件的安装包。你可以在Oracle官方网站上找到Java的下载页面。请确保选择与你的操作系统和计算机架构匹配的安装包。2. 运行安装程序执行Ja
2023-09-23

android studio使用雷电模拟器详细过程(或其他)

文章目录前言雷电设置第一步:点击系统应用打开设置第二步:选择关于平板电脑进入,连续点击版本号五次进入开发者选项(这里我已经有了,所以提示已经处于开发者模式)第三步:退出关于平板电脑,就会看见一个开发者选项,点击进入,把USB调试打开第四步:
2022-06-06

Golang多模块开发的详细过程

这篇文章主要给大家介绍了关于Golang多模块开发的详细过程,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2023-02-14

如何理解Java QQ项目详细设计中的组操作模块

这篇文章将为大家详细讲解有关如何理解Java QQ项目详细设计中的组操作模块,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。好长时间没发博文了,今天再写点,今天写qq软件的组操作模块,由于客户
2023-06-17

使用Virtualbox搭建一个虚拟机的详细过程

这篇文章主要介绍了如何用Virtualbox搭建一个虚拟机,今天先介绍下这个软件如何安装及如何新建一个虚拟电脑,后面有时间再写写如何在虚拟机里面安装CentOS系统和一些配置,需要的朋友可以参考下
2022-11-13

Win11系统下载安装java的详细过程

这篇文章主要介绍了Win11如何下载安装java,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录