Java模拟qq软件的详细过程

目录
  • 登陆界面的实现
    • 登陆界面代码Login类
    • login的监听类 LoginListener
  • 聊天界面运行图
    • Client类代码
    • Server代码
    • 登陆界面代码

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

登陆界面的实现

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

登陆界面代码Login类

package com.lding.net;

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

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:58
 **/
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;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:59
 **/
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;

/**
 * @program: Chat
 * @description: 客户端
 * @author: 王丁
 * @date: 2021-09-26 08:58
 **/
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;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:58
 **/
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;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:59
 **/
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;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 09:00
 **/
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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java模拟QQ桌面截图功能实现方法

    本文实例讲述了Java模拟QQ桌面截图功能实现方法.分享给大家供大家参考.具体如下: QQ的桌面截图功能非常方便,去年曾用Java模拟过一个,现整理出来. 本方法首先需要抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏. import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import

  • Java模拟实现QQ三方登录(单点登录2.0)

    本文实例为大家分享了Java模拟实现QQ三方登录的具体代码,供大家参考,具体内容如下 本次例子模拟这样的情况: 一共有2个spring boot应用: 一个是某公司的web,第二个是QQ服务端. 某公司的应用为127.0.0.1:8082 QQ服务端为127.0.0.1:8081 演示如下: 点击使用QQ登录: 在弹出的界面输入数据点击登录后: 关键代码如下: 某公司web端: MyController.java package cn.it1995.login.controller; impor

  • Java模拟qq软件的详细过程

    目录 登陆界面的实现 登陆界面代码Login类 login的监听类 LoginListener 聊天界面运行图 Client类代码 Server代码 登陆界面代码 **之前在封装代码后出现了问题,按照最初的写法,在登陆完毕后弹出聊天界面后会卡死,原因是当时登陆界面和聊天界面都是使用的主线程,我的代码没有写其他线程,无法多线程运行,因此在弹出聊天界面时线程不够用了,就卡在了监听线程里,因为在监听线程中再有新的监听就会被卡住 在宇哥的指点下,将启动服务器和客户端的部分改为线程,就解决了此问题.改善后

  • Java模拟QQ实现聊天互动程序

    目录 介绍 功能演示 运用到的知识点 核心代码 服务端 客户端 介绍 实现的功能.步骤: 1.定义JFrame窗体中的组件 2.在构造方法中初始化窗体的组件 3.使用网络编程完成数据的传输(TCP,UDP协议) 4.实现发送按钮的监听点击事件 5.实现回车键发送数据 功能演示 没有点发送,数据却发送出去了是因为按了回车键 运用到的知识点 GUI:java实现窗体.Swing.其实JAVA Swing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏.小项目,练练手的.

  • Windows下Docker安装各种软件的详细过程

    一 安装Mysql # docker 中下载 mysql docker pull mysql #启动 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql #进入容器 docker exec -it mysql bash #登录mysql mysql -u root -p //回车输入密码 ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; #

  • Java socket通信模拟QQ实现多人聊天室

    目录 一.socket通信基本原理 二.用socket制作一个多人聊天室 三.实现效果 四.总结 一.socket通信基本原理 socket 通信是基于TCP/IP ⽹络层上的⼀种传送⽅式,我们通常把TCP和UDP称为传输层. ​ 如上图,在七个层级关系中,我们讲的socket属于传输层,其中UDP是⼀种⾯向⽆连接的传输层协议.UDP不关⼼对端是否真正收到了传送过去的数据.如果需要检查对端是否收到分组数据包,或者对端是否连接到⽹络,则需要在应⽤程序中实现.UDP常⽤在分组数据较少或多播.⼴播通信

  • vscode 配置java环境并调试运行的详细过程

    下载vscode以及安装jdk 度娘一大堆 这里不介绍 jdk最好安装jdk11及以上 vscode扩展插件有关 在vscode扩展插件中安装图示插件包,该包基本覆盖java所需的所有内容 新建一个vscode工程,并添加HelloJava.java文件 public class HelloJava{ public static void main(String[] args) { System.out.println("hello world"); } } PS:文件名要与类名一致

  • Java实现AWT四大事件的详细过程

    目录 窗体事件 鼠标事件 所触发的事件 键盘事件 动作事件 小结 常用事件的分类 Java AWT里面的事件可以简单的分为窗体事件(WindowEvent),鼠标事件(MouseEvent),键盘事件(KeyEvent),动作事件(ActionEvent)等事件. 窗体事件 窗体事件是GUI应用程序的基础,应用程序中通常是将其他的组件直接或间接的置于窗体中.在窗体中进行打开,关闭,激活,停用时,JDK提供了一个类WindowEvent用于表示这些窗体事件,定义了一个WindowListener接

  • 在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    目录 什么是Jupyter Notebook? Jupyter Notebook主要优点 环境准备 下载 IJava 创建conda虚拟环境 搭建运行环境 测试 之前使用的那台电脑有点旧了,稍微跑一下程序就报内存不够.本来想考虑入手一台带GPU的新电脑,在商品浏览里的时候,考虑到钱包不够厚实.就选了家里另外一台配置稍微高一点的电脑拿来折腾. 平时我个人开发,主要还是在Eclipse上,新环境也装了装.其实平时学习的话,主要还是跑一跑代码段,不会跑大规模的项目,总有一种到楼下买个菜还要开车去的感觉

  • Java计算代码段执行时间的详细过程

    目录 前言 场景 代码实现 MethodBody 接口定义 CalcExecuteTimeResult 运行结果实体 ExecuteTemplate 执行模板定义 CalcExecuteTimeContext 计算执行时间上下文 测试运行 前言 在日常开发功能时,同一种功能可能会有多种实现方式.我们需要做一个取舍. 最常见的条件就是性能.可读性.可维护性. 本篇文章,我们主要讨论“性能”. 场景 假设我们现在需要计算一段代码的运行时间. 最常见的写法是,在执行这段代码前,获得一下当前的时间戳,在

随机推荐