❤️Java实现模拟QQ(消息通信+登陆界面美化)❤️

一、登陆界面的实现

登陆界面主要使用了JFrame,以及相关的一些组件,并且在界面中加上监听
登陆界面效果图
在这里插入图片描述
登陆界面代码Login类

package com.lding.login;import com.lding.ui.MsgUI;import javax.swing.*;
import java.awt.*;
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;
import java.util.concurrent.DelayQueue;/*** @program: Net* @description: 登陆类* @author: 王丁* @date: 2021-09-25 14:47**/
public class Login {private OutputStream outputStream;private String port;private InputStream inputStream;private boolean flag=false;private JTextField jTextField;private JPasswordField jPasswordField;public JTextField getjTextField() {return jTextField;}public void setjTextField(JTextField jTextField) {this.jTextField = jTextField;}public JPasswordField getjPasswordField() {return jPasswordField;}public void setjPasswordField(JPasswordField jPasswordField) {this.jPasswordField = jPasswordField;}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}public Login(String port){this.port=port;}public Login(InputStream inputStream,OutputStream outputStream, String port) {this.outputStream = outputStream;this.port = port;this.inputStream=inputStream;}public OutputStream getOutputStream() {return outputStream;}public void setOutputStream(OutputStream outputStream) {this.outputStream = outputStream;}public String getPort() {return port;}public void setPort(String port) {this.port = port;}public InputStream getInputStream() {return inputStream;}public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}public void showUI(Login login)  {JFrame jf=new JFrame();jf.setTitle("❤️DDqq登陆界面❤️");jf.setSize(500,400);//只对顶级容器有效jf.setDefaultCloseOperation(3);//窗体关闭时结束程序jf.setLocationRelativeTo(null);//居中jf.setResizable(false);//选择布局类型,定义流式布局对对象,并且设置每个组件之间相隔5FlowLayout 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类把图片加载到内存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);//添加一个button按钮JButton button=new JButton();button.setBorder(BorderFactory.createRaisedBevelBorder());button.setText("login");button.setPreferredSize(dim4);jf.add(button);jf.setVisible(true);//首先实例化登陆按钮监听类的对象,并把登陆界面中的账号和密码输入框的对象传给它LoginListener ll=new LoginListener(jf,textuser,textPassword,login);//对当前窗体添加监听方法button.addActionListener(ll);//监控按钮while (true){
//            for(int i=0;i<10000000;i++){
//                for(int j=0;j<1000000;j++){
//
//                }
//            }//起到延时的作用,System.out.println(1);//如果登陆完毕咋可以跳出这个循环this.flag=ll.isFlag();if(this.flag)break;}this.jTextField=ll.getjTextField();this.jPasswordField=ll.getjPasswordField();System.out.println("ok");}
}

login的监听类 LoginListener

package com.lding.login;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;/*** @program: Net* @description:* @author: 王丁* @date: 2021-09-25 16:17**/
public class LoginListener implements ActionListener {private JTextField jTextField;private JPasswordField jPasswordField;private JFrame login;private Login loginnew;private boolean flag=false;public JTextField getjTextField() {return jTextField;}public void setjTextField(JTextField jTextField) {this.jTextField = jTextField;}public JPasswordField getjPasswordField() {return jPasswordField;}public void setjPasswordField(JPasswordField jPasswordField) {this.jPasswordField = jPasswordField;}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}public LoginListener(JFrame login, JTextField jTextField, JPasswordField jPasswordField, Login loginnew) {this.jTextField = jTextField;this.jPasswordField = jPasswordField;this.login = login;this.loginnew=loginnew;}@Overridepublic void actionPerformed(ActionEvent e) {//输入框需要getText()才能得到字符串if(jTextField.getText().equals("lding")&&String.valueOf(jPasswordField.getPassword()).equals("123456")){this.flag=true;//关闭这个登陆页面,登陆完毕login.dispose();}else if(jTextField.getText().equals("Alice")&&String.valueOf(jPasswordField.getPassword()).equals("123456")){System.out.println(2);this.flag=true;login.dispose();}}
}

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

聊天界面运行图
先登陆Alice的账号 密码为123456
在这里插入图片描述
登陆成功后显示ok,并等待连接
在这里插入图片描述
再登陆冷丁的账号,密码为123456
在这里插入图片描述
当lding账号登陆成功后完成连接,这时候会弹出两个新的JFram窗口,为聊天见面
在这里插入图片描述
随后可以发送消息,消息可以实时显示时间,并显示用户名
一方发送的消息会在另一方的窗口上实时显示出来
在这里插入图片描述
MsgClient类代码

package com.lding.net;import com.lding.login.Login;
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: Net* @description: 聊天室客户端* @author: 王丁* @date: 2021-09-25 10:42**/
public class MsgClient {static public JTextField jTextField;static  private JPasswordField jPasswordField;public JTextField getjTextField() {return jTextField;}public void setjTextField(JTextField jTextField) {this.jTextField = jTextField;}public JPasswordField getjPasswordField() {return jPasswordField;}public void setjPasswordField(JPasswordField jPasswordField) {this.jPasswordField = jPasswordField;}public static  void main(String[] args) throws IOException {//调用登陆界面String port="客户端";Login login=new Login(port);login.showUI(login);//为了防止客户端还没登陆就弹出聊天界面//通过判断flag,当客户端完成登陆后//在login的监听器中将其flag变为true,从而一层层的把客户端中的flag变为trueif(login.isFlag()){//客户端读取登陆用户的名字,也是通过一层层读取jTextField=login.getjTextField();String name=jTextField.getText();System.out.println(login.isFlag());//创建一个Socket连接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(name);//这里用count来判断是用户名输入还是内容输入//由于消息是两部分拼接的,在消息监听器中先后发送了两部分消息//第一部分是发送者的名字,第二部分是消息内容//在输出两种消息的时候采用两种不同的格式,所以对count进行判断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");}}}}
}

MsgServer代码

package com.lding.net;import com.lding.login.Login;
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: Net* @description: 聊天室服务端* @author: 王丁* @date: 2021-09-25 10:42**/
public class MsgServer {static  public JTextField jTextField;static  private JPasswordField jPasswordField;public JTextField getjTextField() {return jTextField;}public void setjTextField(JTextField jTextField) {this.jTextField = jTextField;}public JPasswordField getjPasswordField() {return jPasswordField;}public void setjPasswordField(JPasswordField jPasswordField) {this.jPasswordField = jPasswordField;}public void MsgServerInit(){}public  static void main(String[] args) throws IOException {//调用登陆页面String port="服务端";Login login=new Login(port);login.showUI(login);/*********************************************/ServerSocket serverSocket=new ServerSocket(8888);System.out.println("等待连接!!");Socket clientsocket=serverSocket.accept();//监听连接System.out.println("连接成功!!");jTextField=login.getjTextField();String name=jTextField.getText();InputStream inputStream=clientsocket.getInputStream();OutputStream outputStream=clientsocket.getOutputStream();MsgUI msgUI=new MsgUI(outputStream,name);JTextPane showmsgpane=msgUI.initUI(name);//这里用num来判断是用户名输入还是内容输入//由于消息是两部分拼接的,在消息监听器中先后发送了两部分消息//第一部分是发送者的名字,第二部分是消息内容//在输出两种消息的时候采用两种不同的格式,所以对count进行判断int num=1;while(true){//根据传入的字符数构造字节数组对象int msglenth=inputStream.read();System.out.println("消息长度是:"+msglenth);byte[] msgbytes=new byte[msglenth];//将接下来的数据读入字节数组中inputStream.read(msgbytes);num++;if(num%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");}}}
}

代码改进了一下,还有UI的代码再下发👇

❤️Java实现模拟QQ(改进版)❤️

之后会丰富更多功能 敬请期待!

感谢您的观看!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15458.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT qq登陆界面设计

使用C结合Qt设计的类似QQ的登录界面&#xff0c;以Ui以及代码结合的方式实现&#xff0c;实现了账号注册、号密对比等功能。先看看效果图&#xff1a; 登录界面&#xff1a; 注册界面&#xff1a; 一共有两个窗口&#xff0c;通过槽函数绑定按钮来显示弹窗&#xff08;注册界面…

QT学习之QQ聊天案例

1、实现功能 本程序模拟实现QQ群聊功能&#xff0c;采用UDP通信方式&#xff0c;可以设置字体&#xff0c;保存聊天记录等&#xff0c;实时显示上线离开人数以及具体人员。可视为简化版的腾讯QQ。目前只有群聊&#xff0c;未实现一对一单独聊天。 完整源代码见&#xff1a;ht…

【教学类-36-01】Midjounery生成的四张图片切片成四张小图

作品展示&#xff1a; 把一张正方形图片的四个等大小图切割成四张图片 背景需求 最近在学习ChatGPT的绘画&#xff08;midjounery AI艺术&#xff09; 我想给中班孩子找卡通动物图片&#xff08;黑白线条&#xff09;&#xff0c;打印下来&#xff0c;孩子们练习描边、涂色…

chatgpt赋能python:Python校验身份证号码真伪

Python校验身份证号码真伪 身份证号码是我们日常生活中非常重要的证件&#xff0c;但也有一些人从事非法活动&#xff0c;对身份证号码进行伪造或者篡改。为了保护公民的合法权益&#xff0c;我们需要使用技术手段来校验身份证号码真伪。而Python作为一种广泛应用于数据处理和…

【科普级别:刚出炉的ChatGPT三连问】

科普级别&#xff1a;刚出炉的ChatGPT三连问 前言【ChatGPT是什么&#xff1f;对我们的生活有什么影响&#xff1f;】【中国为什么不能使用ChatGPT&#xff1f;美国想让中国用户使用吗&#xff1f;】【通义千问、文心一言、ChatGPT你更看好哪一个&#xff1f;】 前言 有些人连C…

又一个国内类ChatGPT模型?【秘塔科技上线自研LLM大模型「对话写作猫」】

又一个国内类ChatGPT模型&#xff1f;【秘塔科技上线自研LLM大模型「对话写作猫」】 &#xff08;马上被打脸 ~ ~&#xff09; 一直期待中国有没有类ChatGPT产品可以出现。 昨天&#xff0c;2023年2月27日&#xff0c;秘塔科技上线了自研LLM大模型「对话写作猫」&#xff0c;…

小白入门区块链(通俗易懂)

区块链基础入门 什么是区块链 科技层面解释 数学&#xff0c;密码学&#xff0c;互联网&#xff0c;计算机编程官方解释 区块链是一个分布式的共享账本和数据库&#xff0c;具有去中心化&#xff0c;不可篡改&#xff0c;全程留痕&#xff0c;可以追溯&#xff0c;集体维护&am…

2023年加密行业会更难吗?欧科云链研究院“七大趋势预测”

回望2022&#xff0c;加密行业遭遇了种种不可控因素而导致的艰难险阻&#xff0c;也在变革与发展中孕育着生机与活力。 这一年&#xff0c;我们亲眼目睹了Luna暴雷&#xff0c;三箭资本、FTX这些曾经被认为“大而不倒”的机构接连倒下&#xff0c;市场信心严重受挫&#xff1b…

​别急着骂百度,来看看大模型到底怎么用

文&#xff5c;光锥智能&#xff0c;作者&#xff5c;周文斌&#xff0c;编辑&#xff5c;王一粟 GPT-4惊艳亮相后&#xff0c;压力来到百度这边。 上台后的李彦宏和百度CTO王海峰都略显紧张&#xff0c;这在多年百度相关活动中还是非常少见。李彦宏坦言&#xff0c;“文心一言…

Node.js 高级编程之 Stream(我是跟 ChatGPT 学会的)

前言 在做 SSR Stream Render 的时候遇到了 Node.js 的 Stream&#xff0c;但是对其总是一知半解。正好最近 ChatGPT 很火&#xff0c;找他学一学吧&#xff0c;没想到真的把我教会了。PS&#xff1a;文末有跟 ChatGPT 的精彩对话&#xff08;请忽略我稀烂的英语&#xff09;。…

《不想放水》

原创&#xff1a;刘教链 * * * 由刘教链和ChatGPT共同填词。原曲&#xff1a;S.H.E.《不想长大》。 为什么就是找不到放水的证据呀 为什么救助的银行都不愿退市啊 我并不希望他拥有比特币和黄金 我惊讶的是假话竟然会变成谎话 为什么美元印钞机要转的那么快 为什么通胀和失业率…

存储器介绍

文章目录 存储系统基本概念存储器的层次存储器的分类存储器的性能指标 主存储器半导体元件的原理存储芯片的基本原理寻址 DRAM和SRAMDRAM的刷新DRAM的地址复用 只读存储器ROM主存储器和CPU的连接位扩展字扩展字位同时扩展补充 双端口RAM和多模块存储器双端口RAM解决多核CPU访存…

OpenAI文档翻译——在不通的场景下如何更好的设计ChatGPT提示词

概述 OpenAI可以被广泛的应用于各种任务&#xff0c;他为各种模型提供使用简单而功能强大的API。你可以输入一些文本作为提示词&#xff0c;OpenAI则会生成对应的提示词补全&#xff0c;在使用过程中这就是会话形式以及能够记住上下文的体现。探索如何生成提示词的最好方法就是…

如何使用ChatGPT 写官方声明?

上海车展宝马Mini展台被指区别对待中外访客&#xff0c;向外国访客送冰淇淋&#xff0c;中国访客索要时则说“没有”&#xff0c;此事引发争议。 对此&#xff0c;宝马官方也发布了官方致歉声明&#xff0c;网友看到声明后&#xff0c;纷纷发布自己的看法&#xff0c;有网友还…

独家专访:OpenAI 的 Sam Altman 谈 ChatGPT 以及通用人工智能如何“打破资本主义”

来源: AI前线 作为 OpenAI 的首席执行官&#xff0c;Sam Altman 领导的这家初创公司是正在快速增长的生成式 AI 行业中最热门且最受关注的一家。在 1 月中旬参观了 OpenAI 的旧金山办事处后&#xff0c;福布斯采访了这位最近不太愿意在媒体上抛头露面的投资者和企业家&#x…

ChatGPT is not all you need,一文看尽SOTA生成式AI模型:6大公司9大类别21个模型全回顾(三)

文章目录 ChatGPT is not all you need&#xff0c;一文看尽SOTA生成式AI模型&#xff1a;6大公司9大类别21个模型全回顾&#xff08;三&#xff09;Text-to-Text 模型ChatGPTLaMDAPEERMeta AI Speech from Brain Text-to-Code 模型CodexAlphacode Text-to-Science 模型Galacti…

千万级入口服务[Gateway]框架设计(三:分层模式)

本文将以技术调研模式编写&#xff0c;非技术同学可跳过。 文章目录 背景分层分发Handle分发hook分发并发分层 管道ChannelDemo 实现 小结 附录 背景 基于组件(插件)模式设计构建的入口服务实现中&#xff0c;使用 Go 原生包 plugin 的时候&#xff0c;会存在功能缺陷问题&am…

ChatGPT配合两款神器,1分钟生成流程图

流程图&#xff0c;工作上再正常不过的一种图形&#xff0c;常见制图方法对比&#xff1a; 传统手动制图&#xff1a;耗时耗力&#xff0c;迁移性差AI 辅助制图&#xff1a;使用自然语言提出需求&#xff0c;零基础快速制图 几款常见的我在用的在线绘图工具推荐&#xff1a; Pr…

面向对象实现游戏聊天中的敏感词屏蔽功能,将敏感词汇用星号***替换

import java.util.Scanner;//新建一个类 public class Replace {// 定义一个字符串String commons;// 建一个替换的方法public void replace() { //控制台输入Scanner sc new Scanner(System.in);// 提示输出&#xff08;为方便功能实现&#xff0c;此处提示内定的敏感词汇&am…

DreamGPT:让ChatGPT活在梦里!利用幻觉来激发创意灵感

本文来源 新智元 编辑&#xff1a;LRS 【新智元导读】语言模型幻觉从bug变feature&#xff01; ChatGPT最为人诟病的缺陷就是「胡编乱造」了&#xff0c;可以一本正经地讲一段林黛玉倒拔垂杨柳的故事。 对于真正想了解「林黛玉」或「倒拔垂杨柳」的人来说&#xff0c;这段回答…