在老师打的带领下,用javase的相关知识做出了模拟qq的界面(虽然比较粗糙)。

  1. 先做出登录界面(没有验证密码的功能,输入就登录)
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Socket;public class DengLuDemo extends JFrame {public void DengLu(){this.setSize(400,400);//设置大小,长宽this.setLocationRelativeTo(null);//设置起始位置,居中this.setTitle("欢迎来到XXX聊天室");//设置标题this.setResizable(false);//大小固定this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗口时结束程序运行JPanel jPanel = new JPanel(new GridLayout(4,1));//主面板//创建四个流水分面板//图片、文字JPanel jPanelFirst = new JPanel(new FlowLayout(FlowLayout.CENTER));JLabel jLabelWelcome = new JLabel("欢迎来到XXX聊天室");jLabelWelcome.setFont(new Font("楷体", Font.BOLD, 30));jPanelFirst.add(jLabelWelcome);//账号JPanel jPanelSecond = new JPanel();JLabel jLabelZhangHao = new JLabel("账号");jLabelZhangHao.setFont(new Font("宋体", Font.BOLD, 25));JTextField jTextFieldZhangHao = new JTextField(15);jPanelSecond.add(jLabelZhangHao);jPanelSecond.add(jTextFieldZhangHao);//密码JPanel jPanelThird= new JPanel();JLabel jLabelMiMa = new JLabel("密码");jLabelMiMa.setFont(new Font("宋体", Font.BOLD, 25));JPasswordField jTextFieldMiMa = new JPasswordField(15);jPanelThird.add(jLabelMiMa);jPanelThird.add(jTextFieldMiMa);//登录、注册JPanel jPanelFourth = new JPanel(new FlowLayout(FlowLayout.CENTER,30,30));JButton jButtonDengLu = new JButton("登录");JButton jButtonZhuCe = new JButton("注册");jPanelFourth.add(jButtonDengLu);jPanelFourth.add(jButtonZhuCe);jPanel.add(jPanelFirst);jPanel.add(jPanelSecond);jPanel.add(jPanelThird);jPanel.add(jPanelFourth);this.add(jPanel);this.setVisible(true);//显示窗口,一般放到最后//监听器jButtonDengLu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String zhanghao = jTextFieldZhangHao.getText();String mima = new String(jTextFieldMiMa.getPassword());try {if (zhanghao.length() == 0) {JOptionPane.showMessageDialog(null, "账号不能为空", "账号提示", JOptionPane.ERROR_MESSAGE);} else if (mima.length() == 0) {JOptionPane.showMessageDialog(null, "密码不能为空", "密码提示", JOptionPane.ERROR_MESSAGE);} else {//1.0版本更新后提供注册于账号密码验证功能,方可进入//创建socket,打开聊天窗口Socket socket = new Socket("192.168.31.225",10066);//搜索服务端dispose();//释放此窗口new SicketDemo1(socket,jTextFieldZhangHao).KeHuDuan();//打开聊天界面System.out.println("登录成功");}}catch(Exception e1){JOptionPane.showMessageDialog(null, "服务器搜索失败", "账号提示", JOptionPane.ERROR_MESSAGE);}}});//1.0版本更新后提供账号密码注册功能jButtonZhuCe.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//1.0版本更新后提供账号密码注册功能}});}public static void main(String[] args){new DengLuDemo().DengLu();}
}
  1. 聊天界面+客户端
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Date;public class SicketDemo1 extends JFrame {//初始化SocketSocket socket;DataOutputStream dout;DataInputStream din;JTextField jTextFieldZhangHao;JTextArea jTextArea;//吧客户端对象与账号传进去public SicketDemo1(Socket socket, JTextField jTextFieldZhangHao) throws HeadlessException, IOException {this.socket = socket;this.dout = new DataOutputStream(socket.getOutputStream());this.din = new DataInputStream(socket.getInputStream());this.jTextFieldZhangHao = jTextFieldZhangHao;}//客户端的登录界面public void KeHuDuan() {this.setSize(600, 600);//设置大小,长宽this.setLocationRelativeTo(null);//设置起始位置,居中this.setTitle("欢迎" + jTextFieldZhangHao.getText() + "来到XXX聊天室");//设置标题this.setResizable(false);//大小固定this.setIconImage(new ImageIcon("picture1.png").getImage());this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗口时结束程序运行//边界布局JPanel jPanel = new JPanel(new BorderLayout());//设置两个面板,一个查看聊天记录,一个发消息//看消息,采用滚动的文本域JPanel jPanelLook = new JPanel();jTextArea = new JTextArea(35, 52);jTextArea.setLineWrap(true);//强制换行(横向不能超边界)jTextArea.setEditable(false);//输入框不可编辑JScrollPane jScrollPane = new JScrollPane(jTextArea);//添加滚轮jPanelLook.add(jScrollPane);//法消息,文本框+按钮JPanel jPanelSed = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 5));JTextField jTextField = new JTextField(40);JButton jButton = new JButton("发送");jPanelSed.add(jTextField);jPanelSed.add(jButton);//创建多线程,接受所有客户端发送的信息new SicketDemo2().start();jPanel.add(jPanelLook, BorderLayout.CENTER);jPanel.add(jPanelSed, BorderLayout.SOUTH);this.add(jPanel);this.setVisible(true);//显示窗口,一般放到最后jButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {String str = jTextFieldZhangHao.getText() + ":" + "\n" + "   " + jTextField.getText() + "\t" + new Date().toLocaleString() + "\n";if (str.length() == 0) {JOptionPane.showMessageDialog(null, "输入不能为空", "发送提示", JOptionPane.ERROR_MESSAGE);} else {dout.writeUTF(str);jTextField.setText("");}} catch (IOException ioException) {ioException.printStackTrace();}}});jTextField.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == 10) {try {String str = jTextFieldZhangHao.getText() + ":" + "\n" + "   " + jTextField.getText() + "\t" + new Date().toLocaleString() + "\n";if (str.length() == 0) {JOptionPane.showMessageDialog(null, "输入不能为空", "发送提示", JOptionPane.ERROR_MESSAGE);} else {dout.writeUTF(str);jTextField.setText("");}} catch (IOException ioException) {ioException.printStackTrace();}}}});}//创建线程接受客户端的信息class SicketDemo2 extends Thread {@Overridepublic void run() {while (true) {try {String msg = din.readUTF();System.out.println(msg + "\n");jTextArea.append(msg + "\n");//接受信息,并且发送到客户端窗口} catch (IOException e) {e.printStackTrace();}}}}
  1. 服务端(没做界面)
import javax.swing.text.html.HTMLDocument;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;public class ServerDemo1 {static ArrayList<Socket> arrayList = new ArrayList();public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10066);int account=0;//监听客户端while(true){Socket socket = serverSocket.accept();System.out.println("客户端"+(++account)+"号连接成功");arrayList.add(socket);new ServerSocket1(socket).start();}}//创建一个内部类,用来接受客户端发送的消息,并且给所有的客户端发送消息static class ServerSocket1 extends Thread{Socket clientSocket;DataInputStream din;public ServerSocket1(Socket clientSocket) throws IOException {this.clientSocket = clientSocket;this.din = new DataInputStream(clientSocket.getInputStream());}@Overridepublic void run(){//监听客户端发送的消息boolean flag = true;while (flag){try {String msg = din.readUTF();System.out.println(msg);//将监听到的消息发送给客户端Iterator<Socket> iterator = arrayList.iterator();//迭代器,遍历所有客户端Socket集合0while(iterator.hasNext()){ //判断该集合里面还有没有元素Socket s = iterator.next();if(s.isClosed()){//判断该socket是否关闭iterator.remove();//删除已经下线的客户端continue;}//通过Socket,获得输出流对象DataOutputStream dout = new DataOutputStream(s.getOutputStream());dout.writeUTF(msg);}} catch (IOException e) {e.printStackTrace();flag = false;//客户端下线就停止循环System.out.println("客户端下线了");}}}}
}

这是登录页面

登录操作的监听器没做账号密码判断,只要不为空就行(等学完数据库完善注册功能)


必须开启服务器,才能搜索到

开启服务端后…就可以聊天了 我们多开几个客户端

就可以互相显示聊天内容啦

javase小有所成[捂脸],大佬们不喜勿喷,毕竟才接触java

JavaSE有所小成相关推荐

  1. 小成开发日记-----利用Python在互动吧网站自动抢票实战分析

    作者:小成Charles 商业工作,学习交流请添加Vx:Lcc-Triumph 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/artic ...

  2. 都掌握了吗?Kotlin技能小成

    前些文章描述了 Kotlin教程,包括一些基本语法. 很多时候,还需要加以练习. 本文将开发过程中,遇到的点,整理成线,继而到面 希望 把下面的问题掌握之后,掌握Kotlin在Android中的开发能 ...

  3. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  4. 成功创业小成靠智,大成靠德

    成功创业小成靠智,大成靠德 更新时间:  2011-1-29   | 作者:  sunbus   | 来源:  阳光巴士创业网   | 阅读次数:  134 成功创业小成靠智,大成靠德.儒家云:做人要 ...

  5. [java]JavaSE基础小项目:校园多人畅聊系统

    这是一个基于JavaSE的小项目,从名字我们也能看出来这是个多人聊天系统.下面记录一下整个项目的功能,设计思想以及所用到的知识,大家有兴趣的话,也可以自己尝试练习一下,也算是对SE的复习. 项目名称: ...

  6. 同样25岁,为什么有的人事业小成,有的人却还一无所有?

    同样25岁,为什么有的人事业小成,有的人却还一无所有? 杨镝 开启故事模式~ 一 她今年 25 岁.家在乡镇农村,高中住宿,三年里的每个冬天穿的都是同一件淡黄色棉衣.学习很刻苦,高考成绩不错,去了一所 ...

  7. 菜谱系统小成阶段,Python Web 领域终于攻占一个小山头

    橡皮擦,一个逗趣的互联网高级网虫.新的系列,让我们一起进入 Django 世界. 已经完成的文章 滚雪球学 Python 第三轮,Python Web 之 Django 的世界 小手哆嗦一下,就能用 ...

  8. 每天学一点,一年有小成

    @写在CSDN会员纪念日 每天学习一点点 做为一个写了20年的代码员,现在看来,我是成长的.进步的.1998年大学华业,同年用foxbase编写了第一个交付使用应用.要知道486时代,1.44M的一张 ...

  9. 答《同样 25 岁,为什么有的人事业小成、家庭幸福,有的人却还在一无所有的起点上?》...

    看着满满的一大篇的回答,有点感悟,很长时间我也只是潜水党,没怎么正儿八经的回答过问题,现在认真一回,故事就简短的从我个人的想法说起.     和所有的励志剧情的模式设定一样,我也不出意外的是农村人,不 ...

最新文章

  1. Android RelativeLayout属性
  2. mysql 忘记root密码的解决
  3. 秀一秀我的微软MVP(最有价值专家)的大礼包和水晶奖杯!
  4. 京东业务增长10倍背后的敏捷开发秘籍【案例+分析】
  5. iptables(二)--扩展详解
  6. datagrip中sqlite3导入csv数据集
  7. (转载)芹菜拌豆腐皮 降压小凉菜
  8. 如何直接打开android系统的wifi设置页面,防止intent劫持
  9. CI 什么是构建 gradle
  10. java技术可行性分析_Java可行性分析
  11. cydia无法加载未能连接服务器,cydia无法加载_Cydia无法加载如何办?Cydia加载失败故障的解决方...
  12. SVN Eclipse插件Subclipse安装和配置
  13. 虚拟摄像头之DirectShow虚拟摄像头开发
  14. 微信小程序-加载图片
  15. BIOS INT中断整理
  16. 如何制作CHM帮助文件
  17. Centos7 安装Vpp 及一些学习资料。
  18. Python turtle库的应用实例——画大白(情人节表白神器)
  19. 2022年中式烹调师(高级)操作证考试题库及模拟考试
  20. tensorflow 语义slam_研究《视觉SLAM十四讲从理论到实践第2版》PDF代码+《OpenCV+TensorFlow深度学习与计算机视觉实战》PDF代码笔记...

热门文章

  1. 有什么P图抠图的工具?几个步骤轻松处理
  2. 程序员初级秘籍之servlet快速入门
  3. 地平线旭日X3派小白上手
  4. C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。常见解决办法...
  5. Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
  6. mysql 表 disabled_elementui 表格数据如何设置按钮的 disabled 属性
  7. 唐筛的准确率这么低为什么还要做_唐氏筛查准确率这么低,为什么不能直接做羊水穿刺呢?...
  8. 第一百支月季花(转贴)
  9. form is not define的原因-JavaScript
  10. insmod mknod