一、登陆界面的实现

登陆界面主要使用了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(消息通信+登陆界面美化)❤️相关推荐

  1. Java程序模拟QQ空间登录 - 并模拟刷说说的赞(图文) 注意:腾讯修改了加密算法,已失效(2015-01-31)

    Java程序模拟QQ空间登录 - 并模拟刷说说的赞 背景:在2013-10-25的一天,有个friend在QQ问我:"post登陆QQ空间抓取不到post的数据".于是故事就开始了 ...

  2. 模拟QQ音乐微信登录界面

    模拟QQ音乐微信登录界面 先上代码 html代码 <!DOCTYPE html> <html lang="en"> <head><meta ...

  3. Java实现模拟QQ空间图片上传

    Java实现模拟QQ空间图片上传 首先看效果: 首先编写我们的上传jsp代码,如下: <%@ page language="java" contentType="t ...

  4. 初学java之模拟QQ聊天软件(简单实现)

    引言:这个程序是自从学习java以来写的第一个比较大的图形界面程序,花费了大约一周的时间,作为期末的课程设计,也算是基本上完成了任务,当然由于作者的编程能力有限,代码中难免存在BUG,不太简练,今天搬 ...

  5. Java项目模拟QQ群聊和私聊(网络编程+多线程)

    [文末获取资源] 前几天学习了多线程,最近在学习网络编程,了解了UDP之后又学习了TCP,听一下大佬说,要看看你这两个东西掌握的怎么样,最好的办法就是写一个模拟QQ群聊和私聊,经过这几天的学习,以及不 ...

  6. 利用JAVA手机登录页面_Java用户登陆界面例子 代码

    2,流式布局:FlowLayout.布局方式为从左到右,从上到下.是JPanel(轻量级容器)的默认面板布局. 3,网格布局:GridLayout.布局方式为行和列组成的网络.布局方法:setLayo ...

  7. java rcp中lable设置透明_RCP界面美化技术(转)

    Eclipse RCP 界面概览 Eclipse RCP 简介 Eclipse 是一种基于 Java 的可扩展开源开发平台.就其自身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.同时也 ...

  8. Java笔记-模拟QQ三方登录(单点登录2.0)

    本次例子模拟这样的情况: 一共有2个spring boot应用: 一个是某公司的web,第二个是QQ服务端. 某公司的应用为127.0.0.1:8082 QQ服务端为127.0.0.1:8081 演示 ...

  9. java qq 界面_【Java】仿真qq尝试:聊天界面 响应用户输入

    需求分析: 逐步完善一个"qq仿真"程序. 参考: 1.文本框与文本区:http://www.weixueyuan.net/view/6062.html 2.java布局:http ...

最新文章

  1. 一场事先预告的砸冰箱盛宴
  2. 史上最强音视频下载神器youtube-dl回归,GitHub75k星
  3. linux 报错 kernel: nf_conntrack: falling back to vmalloc 解决方法
  4. MySQL逻辑运算符的使用
  5. vue如何获取年月日_好程序员web前端教程分享Vue相关面试题
  6. Kubernetes Pod入门指南
  7. resultset 代码复用
  8. 制作本地yum镜像站
  9. 关于Java获取系统信息
  10. 使用程序简单查询IP地址
  11. 【论文】PathQG: 基于事实的神经问题生成
  12. 乐虎 尖叫_如果您想更快地尖叫! 为什么政府技术需要(很多)更好的治理
  13. GridSearchCV——信用卡违约率分析示例
  14. 物联网平台由哪些部分组成
  15. 核心单词 Word List 1
  16. Solr之高亮显示-yellowcong
  17. NLS(National Language Support)
  18. ycm-core/YouCompleteMe
  19. Java中的【Object类】
  20. 甲骨文(Oracle)这十年

热门文章

  1. zcat zgrep的使用
  2. TCP握手没成功怎么办
  3. C++-矩阵运算-Eigen-几何矩阵变换-常见几何参数求解-平移-缩放-旋转-仿射变换-垂足-面积-周长-方向角-按目标点和距离移动当前点
  4. java c 1000_Java C1000K 笔记
  5. 车载激光雷达(LIDAR)
  6. 高仿网易云音乐界面 android特效
  7. Andorid 硬件显示系统HWCHWC2架构详解
  8. 密码学03.5(SM4算法)
  9. 开篇:为什么学习 Go 语言
  10. 用break还是continue?